![]() |
|
|
![]()
|
|
| VictorOff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Существует готовое приложение на Delphi, оно позволяет добавлять некую функциональность путем вызова Dll (динамически). Для реализации этой возможности на Embarcadero XE была написана dll, где определена функция
Код главного приложения вызывает функцию без учета декорирования имени («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. |
|||
|
||||
| 586 |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
Либо объявляй c директивой stdcall:
а в Delphi соответственно должен быть тоже stdcall:
Либо, экспортируй функцию через Module Definition File (*.def):
тогда код будет такой:
|
||||||||
|
|||||||||
| VictorOff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Я вероятно, не акцентировал, что возможность внести изменения в приложение на Delphi отсутствует, следовательно stdcall отпадает. Насколько я понимаю, вариант с def-файлом тоже должен использоваться в вызывающей программе?
Достаточно корявое решение проблемы я нашел : создать еще одну dll, которая вызывает первую, и уже там использовать Options/C++ Compiler/Output/Generate underscores on symbol names, так как проект пустой никто не ругается, и уже ее подсунуть в Delphi-приложение. Только как то это уж больно не эстетично... |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
Нет. Нужно в проект с DLL добавить def-файл. Сначала, в папке с проектом создаётся def-файл, потом, выбрать в меню "Project->Add Files to Project", в типе файлов указать "Module Definition File (*.def)", и выбрать необходимый def-файл. Это сообщение отредактировал(а) 586 - 14.3.2012, 09:58 |
|||
|
||||
| VictorOff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 6.8.2007 Репутация: нет Всего: нет |
Большое спасибо, всё получилось.
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |