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