12.09.2006, 12:38 | #1 |
Microsoft Dynamics
|
Вызов экспортируемой функции DLL
Добрый день всем!
Сделал свою DDL на VC++ в которой есть экспортируемая функция, прототип прост до безобразия:HHOOK SetMyHook(HWND hWnd); При попытке вызвать её из Аксапты код функции отрабатывает (ставил MessageBox для проверки), но при попытке вернуть управление в Аксу вываливается следующее сообщение:"Значение регистра ESP не было сохранено при вызове функции "SetMyHook" в библиотеке DLL "AxHook". Причиной может являться вызов функции DLL, которая объявлена с неверным числом аргументов." Может быть кто сталкивался с такой проблемой?
__________________
You should use Bing before asking dumb questions. |
|
12.09.2006, 13:03 | #2 |
Участник
|
Попробойте так
STDAPI_(HHOOK) SetMyHook(HWND hWnd); или HHOOK WINAPI SetMyHook(HWND hWnd);
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 12.09.2006 в 13:06. |
|
12.09.2006, 14:04 | #3 |
Microsoft Dynamics
|
С такими спецификаторами формата вызова функция вообще не экспортируется :
DLL Function not found SetMyHook
__________________
You should use Bing before asking dumb questions. |
|
12.09.2006, 14:31 | #4 |
Microsoft Dynamics
|
Разобрался в сути проблемы, с помощью DLL viewer'a удалось установить, что со спецификатором WINAPI (__stdcall) имя экпортируемой функции SetMyHook преобразуется к _SetMyHook@4... После этого корректировки имени в DLLFunction всё заработало.
__________________
You should use Bing before asking dumb questions. |
|
|
За это сообщение автора поблагодарили: Nick (1). |
12.09.2006, 15:59 | #5 |
Участник
|
Можно сделать так: добавить в ваш заголовочный файл такую строку:
#pragma comment(linker, "/export:SetMyHook=_SetMyHook@4") или создать DEF-файл и в нем прописать LIBRARY "MyDll" EXPORTS SetMyHook Тогда к функции можно будет обращаться по имени "SetMyHook"
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Nick (1), Jabberwocky (1). |
12.09.2006, 16:21 | #6 |
Microsoft Dynamics
|
Спасибо, думаю, вариант с DEF-файлом больше подойдёт как более универсальный. Не смотреть же каждый раз viewer'ом, какое имя функции VC++ удосужится сгенерить на этот раз... И, кажется, была настройка линковщика, управляющая механизмом name mangling... Надо будет посмотреть на досуге
__________________
You should use Bing before asking dumb questions. |
|
12.09.2006, 16:39 | #7 |
Участник
|
Ну имя вычислить довольно просто - впереди подставляется знак подчеркивания, а в конце добавляется "@" + количество байт, передаваемых функции в качестве параметров.
Есть директива extern "С" - но она позволит вызвать по имени только из кода на C/C++. Для оставльных языков - либо DEF-файл, либо ключ /export для линковщика
__________________
Axapta v.3.0 sp5 kr2 |
|
12.09.2006, 17:01 | #8 |
Участник
|
А можно поинтересоваться: что пытаетесь добиться такими манипуляциями?
|
|
12.09.2006, 17:20 | #9 |
Microsoft Dynamics
|
Об этом я уже догадался, но если у меня в функции много параметров, среди которых есть ещё и структуры, то вычисление "искаженного" имени становится нетривиальной задачей. Так что, в моем случае - только DEF файл.
__________________
You should use Bing before asking dumb questions. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Client Axapta 3.0 SP4 и Linux. Как запустить? | 10 | |||
Аргументы функции | 1 | |||
Help! DLL описание функции в аксапте | 16 | |||
при вызове функции из своей DLL, вылетает ошибка | 9 | |||
Вызов DLL из Axapta | 12 |
|