Имеется DLL написанная на С++. В ней две функции, например void Message() и short Add(short, short). Описаны они таким образом:
extern "C" __declspec(dllexport) void Message()
{
MessageBox(NULL, "Message", "Title", MB_OK;
}
extern "C" __declspec(dllexport) short Add(short x, short y)
{
return x+y;
}
Дело вот в чем. Достучаться до первой функции получается без проблем, при попытке обратиться ко второй вылетает сообщение о неправильном формате DLL (функция в Basic описывается соответственно с Integer параметрами, т.к в С++ short занимает 2 байта. Здесь речь идет о VC++ 6.0). Как я понял, ошибка происходит при передаче в DLL параметров по значению. Пробовал передавать ByRef (меняя соответственно short на short*), все то же самое. Объясните плз, в чем дело. Может в DLL описать функции по другому, либо из Basic-а обращаться к ним как-то по особому?
Здравствуйте, Cadet, Вы писали:
C>Может в DLL описать функции по другому, либо из Basic-а обращаться к ним как-то по особому?
первая у тебя Sub, а вот вторая — Function, описание функции:
Private Declare Function Add Lib "xxx.dll" (x As Integer, y As Integer) As Integer
Здравствуйте, Cadet, Вы писали:
C>extern "C" __declspec(dllexport) void __stdcall Message()
C>{
C> MessageBox(NULL, "Message", "Title", MB_OK;
C>}
C>extern "C" __declspec(dllexport) short __stdcall Add(short x, short y)
C>{
C> return x+y;
C>}
[]
Теперь нужно достучаться до имени функций. __stdcall превращает имя функции в такой С-манглед вид: _Func@NNN, где NNN — число байт в стеке. Или использовать def-файл при построении твоей dll-ки.
Private Declare Sub твояMessageфункция Lib "твоя.DLL" Alias "_Message@0" ()
Private Declare Function твояAddфункция Lib "твоя.DLL" Alias "_Add@8" (x As Integer, y As Integer) As Integer
Здравствуйте, SCS, Вы писали:
SCS>первая у тебя Sub, а вот вторая — Function, описание функции:
SCS>SCS>Private Declare Function Add Lib "xxx.dll" (x As Integer, y As Integer) As Integer
SCS>
Да именно так и обращаюсь, а ошибка выскакивает!
Здравствуйте, Cadet, Вы писали:
C>Да именно так и обращаюсь, а ошибка выскакивает!
если
Add(short x, short y)
тогда объявление на VB д.б.
Private Declare Function Add Lib "xxx.dll" (ByVal x As Integer, ByVal y As Integer) As Integer
см. также ответ от Vi2 по поводу использования alias'ов