__cdecl принудительный префикс с подчеркиванием - PullRequest
5 голосов
/ 13 мая 2011

Моя компания предоставляет сторонней организации DLL, которая предоставляет им функции API, которые они могут использовать для подключения к нашему приложению.DLL была написана на VC9, а функции API использовали соглашение о вызовах по умолчанию VC (__cdecl).Сторонние разработчики построили свое приложение на этом интерфейсе.

Теперь мне поручено написать обновленную версию DLL.Мы хотим, чтобы у DLL был точно такой же интерфейс, что и у старого, чтобы их можно было использовать взаимозаменяемо.К сожалению, наша среда разработки теперь CodeGear RAD Studio 2007, поэтому мне нужно написать DLL-библиотеку, используя это.

Наилучшим решением было бы заставить как старые, так и новые DLL экспортировать свои функции как __stdcall.После этого стороннее приложение может быть повторно связано с ожиданием функций __stdcall, и все будут счастливы.К сожалению, по разным причинам это вряд ли произойдет.

Кроме того, я могу объявить функции в моей DLL как __cdecl.Сторонний ожидает функции __cdecl, так что это может показаться хорошим решением.К сожалению, CodeGear настаивает на добавлении подчеркивания ('_') к имени функций __cdecl.Это означает, что стороннее приложение должно было бы выполнить условный вызов MyApiFunction(...) или _MyApiFunction(...), в зависимости от того, какую DLL они используют.

Итак, мой вопрос, как я могу экспортировать функции API из моего новогоDLL таким образом, что они __cdecl и не с префиксом подчеркивания ('_')?

Ответы [ 3 ]

7 голосов
/ 13 мая 2011

Вы должны использовать .DEF файл:

EXPORTS
    HTMLayoutClassNameA = HTMLayoutClassNameA
    HTMLayoutClassNameW = HTMLayoutClassNameW
    HTMLayoutClipboardCopy = HTMLayoutClipboardCopy
    ...

Здесь у нас есть

externalname = internalname 
0 голосов
/ 22 сентября 2016

использовать параметр компилятора -vu, чтобы не ставить префикс подчеркивания к экспортируемым именам символов в bcc

0 голосов
/ 13 мая 2011

Компилятор Borland C / C ++ имеет возможность включать и выключать генерацию подчеркивания для символов. -u (по умолчанию) генерирует подчеркивания в именах символов. Добавьте -u- в командную строку и посмотрите, поможет ли это. (Я не уверен, где это сделать в CodeRad, но я точно уверен, что могу помнить, что это можно сделать где-нибудь в IDE).

...