Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспортирование функций DLL, Как убрать декорирование __stdcall? 
V
    Опции темы
Superklug
Дата 28.10.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

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

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

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

Что нужно изменить?
PM MAIL   Вверх
borisbn
Дата 28.10.2010, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Superklug
Дата 28.10.2010, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

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

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

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

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

void (__stdcall *func)();


Это сообщение отредактировал(а) Superklug - 28.10.2010, 08:31
PM MAIL   Вверх
GremlinProg
Дата 28.10.2010, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

ничего

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Superklug
Дата 28.10.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



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

Не понял... Можете дать пример (как объявить ф-ю в DLL и как потом ее использовать)?
PM MAIL   Вверх
GremlinProg
Дата 28.10.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



для my.dll:
Код

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

для my.exe:
Код

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



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
icecrashldr
Дата 28.10.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет




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

Код

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



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

void (__stdcall *func)();

PM MAIL WWW   Вверх
Superklug
Дата 28.10.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



GremlinProg, я не могу пользоваться lib файлом...


icecrashldr, спасибо! Так вроде все работает...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.