Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Декорация имен в Dll (манглинг), Как убрать "_" перед именем функции 
:(
    Опции темы
VictorOff
Дата 14.3.2012, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Существует готовое приложение на Delphi, оно позволяет добавлять некую функциональность путем вызова Dll (динамически). Для реализации этой возможности на Embarcadero XE была написана dll, где определена функция
Код

extern "C" __declspec(dllexport) char* MyFunc(int MyArg)
{
//…
return "Возвращаемое значение";
}

Код главного приложения вызывает функцию без учета декорирования имени («MyFunc» а не «_MyFunc»). Каким способом сделать так, чтобы в dll содержалось наименование функции без подстрочника?
Были опробованы следующие способы:
1) #pragma comment(linker, "/export: MyFunc =_ MyFunc ") – без изменений, в dll так же «_MyFunc».
2) Убрать галку Options/C++ Compiler/Output/Generate underscores on symbol names – с точки зрения декорирования помогло, в dll содержится «MyFunc», но код самой dll наполнился многочисленными сообщениями об ошибочных вызовах функций без «_» (кажется в основном со стороны компонентов UniDAC)
Буду очень признателен за совет, как еще можно устранить декорирование имени функции в Dll.

PM MAIL   Вверх
586
Дата 14.3.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Либо объявляй c директивой stdcall:
Код
extern "C" __declspec(dllexport) char* __stdcall MyFunc(int MyArg)

а в Delphi соответственно должен быть тоже stdcall:
Код
function MyFunc(i: Integer): PChar; stdcall; external 'library.dll';

Либо, экспортируй функцию через Module Definition File (*.def):
Код
EXPORTS
MyFunc=_MyFunc

тогда код будет такой:
Код
extern "C" char* MyFunc(int MyArg)

PM   Вверх
VictorOff
Дата 14.3.2012, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я вероятно, не акцентировал, что возможность внести изменения в приложение на Delphi отсутствует, следовательно  stdcall отпадает. Насколько я понимаю, вариант с def-файлом тоже должен использоваться в вызывающей программе?
Достаточно корявое решение проблемы я нашел : создать еще одну dll, которая вызывает первую, и уже там использовать Options/C++ Compiler/Output/Generate underscores on symbol names, так как проект пустой никто не ругается, и уже ее подсунуть в Delphi-приложение. Только как то это уж больно не эстетично...
PM MAIL   Вверх
586
Дата 14.3.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(VictorOff @  14.3.2012,  10:28 Найти цитируемый пост)
Насколько я понимаю, вариант с def-файлом тоже должен использоваться в вызывающей программе?

Нет. Нужно в проект с DLL добавить def-файл. Сначала, в папке с проектом создаётся def-файл, потом, выбрать в меню "Project->Add Files to Project", в типе файлов указать "Module Definition File (*.def)", и выбрать необходимый def-файл.

Это сообщение отредактировал(а) 586 - 14.3.2012, 09:58
PM   Вверх
VictorOff
Дата 14.3.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо, всё получилось.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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