Привет всем!
Столкнулся со странной проблемой: при вызове функции, объявленной следующим образом:
function SomeFunction(var Buffer: array of byte): LongBool; stdcall;
методом, описанным ниже:
typedef BOOL __stdcall FNSOMEFUNCTION(OUT PVOID Buffer);
HMODULE hLib = LoadLibrary("somelib.dll");
FNSOMEFUNCTION* pfSF = (FNSOMEFUNCTION*) GetProcAddress(hLib, "SomeFunction");
char* pBuf = (char*)calloc(2, 30);
pfSF(pBuf);
по выходе из функции портится стек (esp больше нужного на 4).
Что интересно, функции, не имеющие конструкции "var ...: array of byte" в параметрах отрабатывают нормально.
В чем может быть проблема?
Здравствуйте, aset, Вы писали:
A>Привет всем!
A>Столкнулся со странной проблемой: при вызове функции, объявленной следующим образом:
A>A>function SomeFunction(var Buffer: array of byte): LongBool; stdcall;
A>
A>по выходе из функции портится стек (esp больше нужного на 4).
A>Что интересно, функции, не имеющие конструкции "var ...: array of byte" в параметрах отрабатывают нормально.
A>В чем может быть проблема?
Возможно в том, что дельфийский
array of Byte не просто
char*, а включает в себя память под размер массива, которую надо проинициализировать перед передачей в функцию.
Здравствуйте, aset, Вы писали:
A>Привет всем!
A>Столкнулся со странной проблемой: при вызове функции, объявленной следующим образом:
A>A>function SomeFunction(var Buffer: array of byte): LongBool; stdcall;
A>
A>методом, описанным ниже:
A>A>typedef BOOL __stdcall FNSOMEFUNCTION(OUT PVOID Buffer);
//Вот так будет правильно:
typedef BOOL __stdcall FNSOMEFUNCTION(char* Buffer, DWORD BufLen);
A>
Или можно явно передать указатель на char и его длинну.
Т.е:
function SomeFunction(Buffer: pChar; BufLen: LongWord): LongBool; stdcall;
Здравствуйте, Tonal-, Вы писали:
T>Здравствуйте, aset, Вы писали:
A>>Привет всем!
A>>Столкнулся со странной проблемой: при вызове функции, объявленной следующим образом:
A>>A>>function SomeFunction(var Buffer: array of byte): LongBool; stdcall;
A>>
A>>методом, описанным ниже:
A>>A>>typedef BOOL __stdcall FNSOMEFUNCTION(OUT PVOID Buffer);
T>//Вот так будет правильно:
T>typedef BOOL __stdcall FNSOMEFUNCTION(char* Buffer, DWORD BufLen);
A>>
T>Или можно явно передать указатель на char и его длинну.
T>Т.е:
T>T>function SomeFunction(Buffer: pChar; BufLen: LongWord): LongBool; stdcall;
T>
Спасибо, заработало