Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Экспортирование функций DLL


Автор: Superklug 28.10.2010, 07:39
Доброго времени суток!
Пишу DLL. Необходимо использовать __stdcall, однако при этом экспортируемые функции декорируются... Т.е. функцию int Sum(int, int) придется вызывать с помощью GetProcAddress как _Sum@8. Думал extern "C" исправит ситуацию, но ничего не изменилось.

Как можно экспортировать функции с недекорированными именами не прибегая к использованию DEF-файлов?

Сейчас я пишу так:
Код

extern "C" __declspec(dllexport) void __stdcall Function();

Что нужно изменить?

Автор: borisbn 28.10.2010, 08:14
сталкивался с такой проблемой. Обходил либо DEF-файлами, либо тип вызова указывал __cdecl. В обоих случаях экспортируется без декорирования

Автор: Superklug 28.10.2010, 08:23
borisbn, я создал DEF-файл. Вроде экспортируются функции без декорирования. Но похоже я их использую как-то неправильно... Видимо нужно указывать __stdcall, но я не знаю как. Сейчас пишу вот так:
Код

void (*func)();
(FARPROC&)func = GetProcAddress(hLib, "Function");
(*func)();

Все ли я правильно делаю?

hLib и func не NULL, т.е. вроде все нормально, но при вызове возникает ошибка. Либо у меня в библиотеке что-то не так, либо вызываю неправильно...

Видимо надо так:
Код

void (__stdcall *func)();

Автор: GremlinProg 28.10.2010, 09:24
Цитата(Superklug @  28.10.2010,  09:39 Найти цитируемый пост)
Что нужно изменить?

ничего

при импорте просто поменять dllexport на dllimport,
за декорирование отвечает еще и extern, так что если импорт был без него, естественно ничего не получится

Автор: Superklug 28.10.2010, 09:53
Цитата(GremlinProg @  28.10.2010,  09:24 Найти цитируемый пост)
при импорте просто поменять dllexport на dllimport,
за декорирование отвечает еще и extern, так что если импорт был без него, естественно ничего не получится 

Не понял... Можете дать пример (как объявить ф-ю в DLL и как потом ее использовать)?

Автор: GremlinProg 28.10.2010, 10:10
для my.dll:
Код

__declspec(dllexport) void __stdcall Function(){
    ::MessageBox( NULL, NULL, NULL, 0 );
}

для my.exe:
Код

#pragma comment( lib, "my" )
__declspec(dllimport) void __stdcall Function();

Автор: icecrashldr 28.10.2010, 10:30

Вы вызываете функция как __cdecl (дефолт значения для компилира) а надо как __stdcall 
http://msdn.microsoft.com/en-us/library/984x0h58%28v=VS.80%29.aspx

Код

void (*func)();
(FARPROC&)func = GetProcAddress(hLib, "Function");
(*func)();



Да надо так..
Код

void (__stdcall *func)();

Автор: Superklug 28.10.2010, 15:14
GremlinProg, я не могу пользоваться lib файлом...


icecrashldr, спасибо! Так вроде все работает...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)