Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL и лишние символы в именах экспортных функций 
:(
    Опции темы
Attack
Дата 19.9.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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"?
PM   Вверх
Alexeis
Дата 19.9.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Dem_max
Дата 19.9.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Код

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



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

Это сообщение отредактировал(а) Dem_max - 19.9.2010, 18:19


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Attack
Дата 19.9.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, про декорацию понял. Попытался от неё избавится с помощью 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"

Это сообщение отредактировал(а) Attack - 20.9.2010, 08:21
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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