Не получается подключить. перепробовал всё подряд, что в интернете нашёл. может у кого получилось?
язык D.
pragma(lib, "bass"); extern(C) bool BASS_SetVolume(float); void main(){ BASS_SetVolume(0.3); }
coffimplib.exe и implib.exe тоже использовал.
Че пишет то?
У меня все работает (с)
implib -a bass.lib bass.dll
dmd main.d
implib брал с http://www.digitalmars.com/
implib.exe /s mydll.lib mydll.dll
dmd main.d
main
object.Error@(0): Access Violation ---------------- 0x00000001 0x0018FEBC 0x0040233F 0x00402257 0x00402037 0x74E37C04 in BaseThreadInitThunk 0x7732AD1F in RtlInitializeExceptionChain 0x7732ACEA in RtlInitializeExceptionChain
запускаю от админа
А авторы bass, оказываетсо мудаки.
Короче, calling convention не торт
правильно будет так:
extern(Windows) int BASS_SetVolume( float);
Но, lib файл придется генерить из def файла
implib bass.lib bass.def
с таким примерно содержимым:
LIBRARY bass
EXPORTS
_BASS_SetVolume@4=BASS_SetVolume
И возвращается int, так как bass юзает мудацкий BOOL дефайнящийся в int.
Вот так вот.
спасибо тебе добрый человек. работает.
А как этак строчка будет выглядеть под линуксом?
> extern(Windows) int BASS_SetVolume(float);
Не extern(Linux) ведь?
Dimich
Под линуксом должно прокатить extern(C), если у авторов еще мозг где-то остался.
день добрый. работает да не работает.
LIBRARY bass EXPORTS _BASS_SetVolume@4=BASS_SetVolume _BASS_GetVersion@0=BASS_GetVersion
import std.stdio; pragma(lib, "bass.lib"); extern(Windows){ uint BASS_SetVolume(float); uint BASS_GetVersion(); } void main(){ auto setvolume = BASS_SetVolume(0.3); auto getversion = BASS_GetVersion(); writefln("%s, %s", getversion, setvolume); }
d:\MEGAsync\Development\D>implib /s bass.lib bass.def Digital Mars Import Library Manager Version 7.6B1n Copyright (C) Digital Mars 2000. All Rights Reserved. Output is a Windows WIN3 import library. Digital Mars Import Library Creator complete. d:\MEGAsync\Development\D>dmd main.d d:\MEGAsync\Development\D>main 33819392, 0
ни в какую не хочет менять звук. (windows 8.1, x64)
хотя версию вытаскивает из bass
А документацию почитать?
http://www.un4seen.com/doc/#bass/BASS_SetVolume.html
LIBRARY bass EXPORTS _BASS_SetVolume@4=BASS_SetVolume _BASS_GetVersion@0=BASS_GetVersion _BASS_ErrorGetCode@0=BASS_ErrorGetCode _BASS_Init@32=BASS_Init
import std.stdio; pragma(lib, "bass.lib"); extern(C){ uint BASS_GetVersion(); uint BASS_Init(int, uint, uint, uint, uint); uint BASS_SetVolume(float); uint BASS_ErrorGetCode(); } void main(){ uint BASS_DEVICE_DEFAULT = 0; auto getversion= BASS_GetVersion(); auto init= BASS_Init(-1, 44100, BASS_DEVICE_DEFAULT, 0, 0); auto setvolume= BASS_SetVolume(0.22); auto errorgetcode= BASS_ErrorGetCode(); writefln("%s, %s, %s : %s", getversion, init, setvolume, errorgetcode); }
d:\MEGAsync\Development\D>main 33819392, 1, 1 : 0
мда. внимательнее надо читать. спасибо.
в данном случае сработало и с extern(C)
lib через implib /s /noi bass.lib bass.dll
в BASS_GetDeviceInfo определена структура BASS_DEVICEINFO
не намекнёшь как указать?
extern(C) { uint BASS_GetDeviceInfo(uint, ???); }
спасибо за помощь.
http://dlang.org/interfaceToC.html
Вот таблица как типы маппятся, если там указатель то он так и будет
день добрый. что то я делаю не так... хотя информация какая никакая получена.
alias uint DWORD; extern(C){ bool BASS_GetDeviceInfo(DWORD, void* info); } void main(){ struct BASS_DEVICEINFO{ char *name; char *driver; DWORD flags; } BASS_DEVICEINFO di; auto getdeviceinfo = BASS_GetDeviceInfo(0, &di); writefln("%s, %s, %x", di.name, di.driver, di.flags); } d:\MEGAsync\Development\D>main 667308, 6673C8, 2000007
Тема в архиве.