Реферат: Создание в среде Borland C++ Builder dll, совместимой с Visual C++
// показываем VCL-форму
GridForm->Show();
// возвращаем хэндл VCL-окна клиентскому приложению,
// дабы оно могло это окно при необходимости закрыть
return GridForm->Handle;
}
catch(...)
{
return NULL;
}
}
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
Проанализируем сформированные компилятором наименования экспортируемых функций. Воспользовавшись утилитой 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
EXPORTS ; VC funcname = BCB funcname SumFunc = _SumFunc |
То есть, у функции, экспортируемой как _SumFunc, будет псевдоним SumFunc, который мы исключительно для удобства делаем идентичным оригинальному имени этой функции в коде (хотя псевдоним может быть каким угодно).