Проанализируем сформированные компилятором
наименования экспортируемых функций. Воспользовавшись утилитой impdef.exe, поставляемой совместно с C++Builder (находится в каталоге $(BCB)Bin, синтаксис
командной строки – impdef.exe ExplicitDll.def ExplicitDll.dll), получим
следующий .def-файл
ExplicitDll.def
LIBRARY EXPLICITDLL.DLL
EXPORTS
ViewStringGridWnd @1 ;
ViewStringGridWnd
_SumFunc @2 ; _SumFunc
___CPPdebugHook @3 ; ___CPPdebugHook
|
Поскольку в данном примере экспортируемая функция
ViewStringGridWnd использует соглашение __stdcall, ее имя осталось неизменным
(см. таблицу 1), следовательно, для вызова этой функции VC-приложение
воспользуется именем ViewStringGridWnd (например, при вызове GetProcAddress), а
вот для вызова функции SumFunc использовать придется имя _SumFunc. Очевидно, что осуществлять вызов функции, пользуясь ее измененным именем, неудобно само
по себе, а тем более, если dll пишет один программист, а работает с ней другой.
Для того чтобы при использовании __cdecl-соглашения экспортируемые функции
можно было использовать с их истинными именами (без символов подчеркивания), необходимо об этом позаботиться заранее, то есть на этапе создания самой dll.
Для этого создается .def-файл (это можно сделать в любом текстовом редакторе), в котором определяется секция EXPORTS, содержащая псевдоним (alias) для каждой
экспортируемой __cdecl-функции. В нашем случае он будет выглядеть следующим
образом
ExplicitDllAlias.def