Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > DLL и лишние символы в именах экспортных функций


Автор: Attack 19.9.2010, 17:15
VS2010
Win7 64bit
dll 32bit

DLL:
Код

// Win32 dll (без MFC)
#include "stdafx.h"

extern "C" __declspec(dllexport) void __stdcall MyFunction(void)
{
     MessageBox(0, L"DLL say hello!", L"", MB_OK);
}
При компиляции получаю dll, а в экспорте 1 функция - "_MyFunction@0".

Вопрос: почему функция назвалась "_MyFunction@0", а не "MyFunction"?

Автор: Alexeis 19.9.2010, 18:06
Цитата(Attack @  19.9.2010,  16:15 Найти цитируемый пост)
Вопрос: почему функция назвалась "_MyFunction@0", а не "MyFunction"? 

Это называется декорация имен. Перечисляются параметры и их размер. Если добавить extern "C", то @0 исчезнет. Еще декорация зависит от соглашения о вызовах.

Автор: Dem_max 19.9.2010, 18:18
используй DEF файл чтобы убрать декорацию имен он примерно выглядит так

Код

EXPORTS
    ; BCB funcname           = VS funcname
    UnInit                = @UnInit
    Start               = _Start
    MyFunction     = _MyFunction@0



Дело в том что VS при соглашении вызова __stdcall  делает не "MyFunction", а "_MyFunction@0", при соглашении вызова __cdecl она делает наоборот "MyFunction".

Автор: Attack 19.9.2010, 22:23
Спасибо, про декорацию понял. Попытался от неё избавится с помощью def файла, но линкер его почему то игнорирует:
Код

// Win32 dll (без MFC)
#include "stdafx.h"

#pragma comment(linker, "/def:DLL.def") // <- Тут подключаю def файл

extern "C" __declspec(dllexport) void __stdcall MyFunction(void)
{
     MessageBox(0, L"DLL say hello!", L"", MB_OK);
}

Вот что говорит линкер при компиляции:
Код

... warning LNK4229: встретилась недопустимая директива "/def:DLL.def"; не учитывается


Добавлено:
Интересно, линкер пропускает строчку 
Код

#pragma comment(linker, "/def:DLL.def")

однако когда я указал DLL.def файл у свойствах проекта "Проект->Свойства->Компоновщик->Ввод->Файл определения модуля" (Project Properties->Linker->Input->Module Definition File)
всё нормально скомпилировалось и функция в экспорте назвалась "MyFunction"

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