Delphi вызывает DLL VC
Extern «C» void __declspec(dllexport) __stdcall ShowMess(HWND hwnd, char* беспорядок);
Формат вывода: _ShowMess@8, «8» — количество байтов параметров функции.
Чтобы избежать разделения имен, для решения проблемы можно использовать следующие методы:
1. Не добавляйте __stdcall в оператор и используйте формат __cdecl по умолчанию VC. Однако в Delphi вы должны указать, что формат вызова — cdecl.
2. Добавьте файл def в проект VC, например:
БИБЛИОТЕКА
ЭКСПОРТ
ШоуМесс@1
Тогда имя выходной функции в DLL не разбивается.
PROcedure ShowMess (h:HWND; беспорядок:PChar;{Cdecl;} external LibName);
Если оператор Stdcall или Cdecl отсутствует, Delphi по умолчанию использует формат вызова Register(FastCall).
#pragma пакет(4)
//определение структуры
#прагма-пакет()
TDump.exe — предоставляется Delphi 4 и C++ Builder 3.
Impdef.exe и Implib.exe — предоставляются C++ Builder 3.
DumpBin.exe — предоставлен VC5.0
Lib.exe — предоставлен VC5.0
VC вызывает DLL Delphi
Функция ShowDialog(hMainWnd:THandle; Msg:PChar):integer;
Имена не разделяются при выводе в файл Dll.
extern "C" __declspec(dllimport) int __stdcall ShowDialog( HWND hwnd,char* Msg );
. Если включен __stdcall, необходимо разделить соответствующее имя функции в файле Lib. Для создания файла Lib можно использовать следующие шаги:
. Используйте Impdef.exe для создания файла определения в формате: Имя файла определения Impdef имя файла dll
. Вручную настроить параметры файла def, например изменить ShowDialog на ShowDialog@8.
. Используйте Lib.exe для создания файлов lib в формате: Lib /def:def имя файла.
. Если в операторе нет __stdcall, форматом вызова по умолчанию остается stdcall, но разделение имен не требуется. Для создания файла Lib используйте следующий пакетный файл MkLib.bat:
@эхо выключено
если %1.==. ошибка перехода
imdef %1.def %1.dll
библиотека /def:%1.def
перейти к концу
:ошибка
Использование echo: MkLib DllName
echo Примечание. Не добавляйте расширение «.dll» к параметру «DllName».
:конец