Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Имена экспортируемых функций Dll

501
31 января 2006 года
hell_admin
110 / / 02.10.2004
Создал DLL на VC++ и подключаю ее к C++ Builder'y а он пишет мол немогу найти функцию с таким именем и все, че тока не пробовал..

В конце концов где то узна про такую штуку как TDump задампил свою DLL и увидел что вместо имени моей функции _GetInfo, экспортиуется _GetInfo@4,
поменял на нее в GetProcAddress все запахало...
но че то влом каждый раз смотреть как он назовет мою функцию..
где в опциях можно отключить это добавление @i?
3
31 января 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by hell_admin
Создал DLL на VC++ и подключаю ее к C++ Builder'y а он пишет мол немогу найти функцию с таким именем и все, че тока не пробовал..

В конце концов где то узна про такую штуку как TDump задампил свою DLL и увидел что вместо имени моей функции _GetInfo, экспортиуется _GetInfo@4,
поменял на нее в GetProcAddress все запахало...
но че то влом каждый раз смотреть как он назовет мою функцию..
где в опциях можно отключить это добавление @i?


Смотри в сторону extern "C"

398
01 февраля 2006 года
Alexandoros
630 / / 21.10.2005
DLL: (.h файл)
extern "C" __declspec(dllexport) int Hi(DWORD);

EXE:
Hi = (TypeHi)GetProcAddress(hLib, "Hi");
501
01 февраля 2006 года
hell_admin
110 / / 02.10.2004
Сорри надо было сразу код привести

Код:
//dll.h
#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

Соответсвенно
 
Код:
GetInfo = (CSecurityDllInfo(WINAPI*)(CSecurityMainInfo *))GetProcAddress(dll,"_GetInfo@4");

работает
а
 
Код:
GetInfo = (CSecurityDllInfo(WINAPI*)(CSecurityMainInfo *))GetProcAddress(dll,"_GetInfo");

Не работает
На _ в начале имени я согласен, но каждый раз смотреть че оно там после собаки добавило никайф
398
01 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Убери подчеркивание в имени в GetProcAddress
501
07 февраля 2006 года
hell_admin
110 / / 02.10.2004
Цитата:
Originally posted by Alexandoros
Убери подчеркивание в имени в GetProcAddress


Убирал.. тольку никакого

398
07 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Пример для студии. Может поможет.
243
14 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by hell_admin
Убирал.. тольку никакого


Столкнулся с такой проблемой сам. До этого делал dll-ки только в билдере, там действительно помогает extern "C". А в VC 7.0 (не 7.1 как у Alexandros) тоже работает, но(!) только не для функий-хуков. Например функцию
LRESULT CALLBACK keyb_hook(int code, WPARAM wParam, LPARAM lParam)
он переделывает вот в такую штуку: _keyb_hook@12 - и ни как иначе.
Обошел при помощи DEF-файла с содержимым:

 
Код:
LIBRARY my_dll
EXPORTS
keyb_hook = keyb_hook

Теперь все так, как надо. Но остается вопрос - почему метод с extern "C" не подействовал? Если кто знает - поделитесь.
398
14 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Короче глюк наверное. При спецификации __stdcall ( CALLBACK, WINAPI...) Идет преобразование имен - перед именем ставится _, а после имени @количество_байт_в_параметрах_в_десятичной_системе. Поскольку в стек в 32 битном режиме передается 4 байта минимум, то фактически если объявление ф-ции
__stdcall hi(char c);
то оно преобразуется в _hi@4.

Это с extern "C".
Без него имя преобразуется в что-то типа ?_hi@@YGJHIJPADG (взято от балды)
243
14 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Alexandoros
Короче глюк наверное. При спецификации __stdcall ( CALLBACK, WINAPI...) Идет преобразование имен - перед именем ставится _, а после имени @количество_байт_в_параметрах_в_десятичной_системе. Поскольку в стек в 32 битном режиме передается 4 байта минимум, то фактически если объявление ф-ции
__stdcall hi(char c);
то оно преобразуется в _hi@4.

Это с extern "C".
Без него имя преобразуется в что-то типа ?_hi@@YGJHIJPADG (взято от балды)


Ну да, я тоже пришел к такому выводу. В общем - def-файл рулит.

398
14 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by pacific_7
Ну да, я тоже пришел к такому выводу. В общем - def-файл рулит.


Выложи проект плиз, а то я не знаю как дефы юзать :)

243
14 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Alexandoros
Выложи проект плиз, а то я не знаю как дефы юзать :)


А что там юзать то? Я тоже не знал до вчерашнего дня :). Полное содержимое этого файла необходимое для решения данной проблемы приведено выше.
Добавляешь в сорцы проекта def-файл. Он сам в нем добавляет первую строчку (LIBRARY my_dll). Далее - пишешь:
EXPORTS
имя_функции_в_разделе_экспорта = имя_функции_в_сорцах

имя_функции_в_разделе_экспорта - под таким видом экспортируем функцию из dll-ки функцией GetProcAddress(). Т.е. там можно хоть popa_s_bolshoy_ruchkoy написать за вместо того имени, которое у тебя используется в самом коде dll.
Собсно - всё.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог