AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2006, 12:38   #1  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Вызов экспортируемой функции 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Попробойте так
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  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
С такими спецификаторами формата вызова функция вообще не экспортируется :
DLL Function not found SetMyHook
__________________
You should use Bing before asking dumb questions.
Старый 12.09.2006, 14:31   #4  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Разобрался в сути проблемы, с помощью 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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно сделать так: добавить в ваш заголовочный файл такую строку:
#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  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Спасибо, думаю, вариант с DEF-файлом больше подойдёт как более универсальный. Не смотреть же каждый раз viewer'ом, какое имя функции VC++ удосужится сгенерить на этот раз... И, кажется, была настройка линковщика, управляющая механизмом name mangling... Надо будет посмотреть на досуге
__________________
You should use Bing before asking dumb questions.
Старый 12.09.2006, 16:39   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну имя вычислить довольно просто - впереди подставляется знак подчеркивания, а в конце добавляется "@" + количество байт, передаваемых функции в качестве параметров.

Есть директива extern "С" - но она позволит вызвать по имени только из кода на C/C++.

Для оставльных языков - либо DEF-файл, либо ключ /export для линковщика
__________________
Axapta v.3.0 sp5 kr2
Старый 12.09.2006, 17:01   #8  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
А можно поинтересоваться: что пытаетесь добиться такими манипуляциями?
Старый 12.09.2006, 17:20   #9  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ну имя вычислить довольно просто - впереди подставляется знак подчеркивания, а в конце добавляется "@" + количество байт, передаваемых функции в качестве параметров.
Об этом я уже догадался, но если у меня в функции много параметров, среди которых есть ещё и структуры, то вычисление "искаженного" имени становится нетривиальной задачей. Так что, в моем случае - только DEF файл.
__________________
You should use Bing before asking dumb questions.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Client Axapta 3.0 SP4 и Linux. Как запустить? Daiver DAX: Администрирование 10 28.06.2007 15:59
Аргументы функции Eldar9x DAX: Программирование 1 22.11.2006 22:49
Help! DLL описание функции в аксапте ivas DAX: Программирование 16 27.04.2006 19:15
при вызове функции из своей DLL, вылетает ошибка Delfins DAX: Программирование 9 07.03.2006 19:29
Вызов DLL из Axapta Tony Green DAX: Программирование 12 18.10.2005 12:20

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:49.