Имена экспортируемых функций Dll
В конце концов где то узна про такую штуку как TDump задампил свою DLL и увидел что вместо имени моей функции _GetInfo, экспортиуется _GetInfo@4,
поменял на нее в GetProcAddress все запахало...
но че то влом каждый раз смотреть как он назовет мою функцию..
где в опциях можно отключить это добавление @i?
Создал DLL на VC++ и подключаю ее к C++ Builder'y а он пишет мол немогу найти функцию с таким именем и все, че тока не пробовал..
В конце концов где то узна про такую штуку как TDump задампил свою DLL и увидел что вместо имени моей функции _GetInfo, экспортиуется _GetInfo@4,
поменял на нее в GetProcAddress все запахало...
но че то влом каждый раз смотреть как он назовет мою функцию..
где в опциях можно отключить это добавление @i?
Смотри в сторону extern "C"
extern "C" __declspec(dllexport) int Hi(DWORD);
EXE:
Hi = (TypeHi)GetProcAddress(hLib, "Hi");
#define EXPORT extern "C" __declspec (dllexport)
EXPORT CSecurityDllInfo CALLBACK GetInfo(CSecurityMainInfo * info);
//dll.cpp
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
EXPORT CSecurityDllInfo CALLBACK GetInfo(CSecurityMainInfo * info)
{
CSecurityDllInfo rInfo;
rInfo.majVer = 0;
rInfo.minVer = 0;
rInfo.month = 0;
return rInfo;
}
А вот что выдает TDump
....
Exports from sec_vc.dll
1 exported name(s), 1 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
0000100A 1 0000 _GetInfo@4
Соответсвенно
работает
а
Не работает
На _ в начале имени я согласен, но каждый раз смотреть че оно там после собаки добавило никайф
Убери подчеркивание в имени в GetProcAddress
Убирал.. тольку никакого
Убирал.. тольку никакого
Столкнулся с такой проблемой сам. До этого делал dll-ки только в билдере, там действительно помогает extern "C". А в VC 7.0 (не 7.1 как у Alexandros) тоже работает, но(!) только не для функий-хуков. Например функцию
LRESULT CALLBACK keyb_hook(int code, WPARAM wParam, LPARAM lParam)
он переделывает вот в такую штуку: _keyb_hook@12 - и ни как иначе.
Обошел при помощи DEF-файла с содержимым:
EXPORTS
keyb_hook = keyb_hook
Теперь все так, как надо. Но остается вопрос - почему метод с extern "C" не подействовал? Если кто знает - поделитесь.
__stdcall hi(char c);
то оно преобразуется в _hi@4.
Это с extern "C".
Без него имя преобразуется в что-то типа ?_hi@@YGJHIJPADG (взято от балды)
Короче глюк наверное. При спецификации __stdcall ( CALLBACK, WINAPI...) Идет преобразование имен - перед именем ставится _, а после имени @количество_байт_в_параметрах_в_десятичной_системе. Поскольку в стек в 32 битном режиме передается 4 байта минимум, то фактически если объявление ф-ции
__stdcall hi(char c);
то оно преобразуется в _hi@4.
Это с extern "C".
Без него имя преобразуется в что-то типа ?_hi@@YGJHIJPADG (взято от балды)
Ну да, я тоже пришел к такому выводу. В общем - def-файл рулит.
Ну да, я тоже пришел к такому выводу. В общем - def-файл рулит.
Выложи проект плиз, а то я не знаю как дефы юзать :)
Выложи проект плиз, а то я не знаю как дефы юзать :)
А что там юзать то? Я тоже не знал до вчерашнего дня :). Полное содержимое этого файла необходимое для решения данной проблемы приведено выше.
Добавляешь в сорцы проекта def-файл. Он сам в нем добавляет первую строчку (LIBRARY my_dll). Далее - пишешь:
EXPORTS
имя_функции_в_разделе_экспорта = имя_функции_в_сорцах
имя_функции_в_разделе_экспорта - под таким видом экспортируем функцию из dll-ки функцией GetProcAddress(). Т.е. там можно хоть popa_s_bolshoy_ruchkoy написать за вместо того имени, которое у тебя используется в самом коде dll.
Собсно - всё.