Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Как вызвать функцию с параметрами из сторонней DLL? 29.09.09 06:57
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 29.09.09 07:06 Количество правок: 5
|
Есть DLL, в которой есть две функции, которые объявлены вот так:
extern "C" __declspec(dllexport) int process(int width, int height, char* buffer);
extern "C" __declspec(dllexport) void init();
---
Я подключаю их к своей программе следующим образом:
HINSTANCE hinstDll
hinstDll = LoadLibrary("myDll.dll");
void (__stdcall *init)();
int (__stdcall *process)(int width, int height, char* buffer);
init = (void (__stdcall *)()) GetProcAddress(hinstDll, "init");
process = (int (__stdcall *)(int width, int height, char* buffer)) GetProcAddress(hinstDll, "process");
---
Затем обращаюсь к ним:
char szBuf[100];
init();
process(10, 10, szBuf);
---
Первая функция отрабатывает коректно, а вот со второй проблемы: если оставить только числовые параметры, то всё работает нормально, но когда у этой функции есть параметр-указатель, то при попытке обращения к этой функции выскакивает окно с ошибкой "Debug Error". Вот, что там написано:
Program: myprogram.exe
Module:
File: i386\checkesp.c
Line:42
The value of ESP was not properly saved across function call. This is usually a
result of calling a function declared with one calling convertion with a function
pointer declared with a different calling convertion.
---
Даже если я в самом начале функции process ставлю return (т.е. не выполняю никаких действий) ошибка продолжает появляться. Такое ощущение, что ошибка возникает ещё до входа в функцию.
Что делать?
|
 |
Почитай все таки чего нибудь общеобразовательного. Нет, правда 29.09.09 09:51
Автор: amirul <Serge> Статус: The Elderman
|
Почитай про соглашения о вызовах. В частности чем отличаются __cdecl от __stdcall
> Первая функция отрабатывает коректно, а вот со второй У нее нет аргументов, соответственно __cdecl для такой функции идентичен __stdcall
> проблемы: если оставить только числовые параметры, то всё > работает нормально, но когда у этой функции есть > параметр-указатель, то при попытке обращения к этой функции > выскакивает окно с ошибкой "Debug Error". Вот, что там > написано: > > Program: myprogram.exe
> Module:
> File: i386\checkesp.c
> Line:42
>
> The value of ESP was not properly saved across function
> call. This is usually a
> result of calling a function declared with one calling
> convertion with a function
> pointer declared with a different calling convertion.
> ---
Вот здесь тебе прямым текстом сказали в чем проблема. Не понимаю почему так трудно почитать чего нибудь по теме.
> Даже если я в самом начале функции process ставлю return > (т.е. не выполняю никаких действий) ошибка продолжает > появляться. Такое ощущение, что ошибка возникает ещё до > входа в функцию. Нет, ломается после выхода (return то ты все равно ставишь).
> Что делать? Больше читать, меньше писать
|
 |  |
попробую учесть. Спасибо, сэнсэй. 29.09.09 15:29
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
|
|
|