Visual C++ искажает имя экспортируемой функции, хотя export "C" указан

Тема в разделе "LANGS.C", создана пользователем SoftCreator, 18 окт 2010.

  1. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Добрый день всем!

    Я тут уже мозг себе сломал с такой проблемой: экспортирую простую функцию из DLL.
    Пишу так:
    Код (Text):
    1. extern "C" __declspec(dllexport) int __stdcall func(int param) { /* код */ }
    В таблице экспорта получаю _func@4.
    Пробовал убрать __stdcall, получаю func.
    А я хочу, чтобы функция была stdcall, неужто надо def-файл писать?
    И вообще, какого, спрашивается, Visual C++ искажает имя функции при живом extern "C"?
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    SoftCreator
    Можно и без него:
    Код (Text):
    1. #pragma comment(linker, "/export:func=_func@4")
    2. extern "C" int __stdcall func(int param) { /* код */ }
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У автора OllyDbg в plugin.h можно прочитать такие строки

    Код (Text):
    1.   // Borland adds underscore to export automatically, whereas I don't know any
    2.   // such option for Microsoft compiler. This solution is not too elegant but
    3.   // works.
    4.   #define ODBG_Plugindata      _ODBG_Plugindata
    5.   #define ODBG_Plugininit      _ODBG_Plugininit
    6.   #define ODBG_Pluginmainloop  _ODBG_Pluginmainloop
    7.   .....
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Без него VC++ декорировал бы имя ещё круче (если исходник компилируется как C++). #pragma comment(linker, "/export:…") добавляет синоним экспортируемого имени. Самое забавное что если добавить опцию /export:func в дополнительные для линкера, всё выходит красиво, даже без __declspec(dllexport)/extern "C". Такие вот пироги.
     
  5. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Заработало!
    Код (Text):
    1. #pragma comment(linker, "/export:func=_func@4")
    2. extern "C" int __stdcall func(int param) { /* код */ }
    Спасибо за советы!