Вопрос как правильно передать параметры в функцию вызванную из dll написанной на с++.
1. В uPluginData.pas создал структуры методов
Код:
TSendPacketStr = procedure (pck: string; const tid: integer; const ToServer: Boolean);stdcall;
TGetConnectionName = function(id : integer):string;stdcall;
TGetConnectioIdByName = function(name : string):integer;stdcall;
PSendPacketStr = ^TSendPacketStr;
PGetConnectionName = ^TGetConnectionName;
PGetConnectioIdByName = ^TGetConnectioIdByName;
// PSendPacketStr = TSendPacketStr;
TCFunctionStruct = record
pSendPacketStr: PSendPacketStr;
pGetConnectionName: PGetConnectionName;
pGetConnectioIdByName: PGetConnectioIdByName;
end;
PCFunctionStruct = ^TCFunctionStruct;
2. Описал функцию DLL в которую буду передавать указатель на структуру функций.
Код:
TSetCFStruct = function(const struct: PCFunctionStruct): Boolean; stdcall;
3. Создал переменную в которую буду записывать адрес на функцию DLL
Код:
SetCFStruct: TSetCFStruct;
4. При загрузке DLL. Нахожу адрес и записываю в переменную. А также передаю указатель на функцию.
Код:
@SetCFStruct:=GetProcAddress(hLib, 'SetFunctionStruct');
if(Assigned(SetCFStruct)) then
begin
ScriptStruct.pSendPacketStr:=@TPluginStructClass.SendPacketStr;
ScriptStruct.pGetConnectionName:=@TPluginStructClass.getConnectionName;
ScriptStruct.pGetConnectioIdByName:=@TPluginStructClass.getConnectioidByName;
SetCFStruct(@ScriptStruct);
end;
5. Описываю структуру функций из Delphi и функцию в которой буду передавать указатель.
Код:
// Структура скриптов
struct ScriptStruct
{
void(*sendPacketStr)(unsigned char* pck, const int tid, bool toServer);
char*(*getConnectionName)(int);
int(*getConnectioIdByName)(char* name);
};
/// Функция передачи указателя на ScriptStruct
DLL_API bool SetFunctionStruct(ScriptStruct * scriptStruct);
6. Далее в сpp пишу описание функци
Код:
// Вызывается при включении плагина
DLL_API bool SetFunctionStruct(ScriptStruct * scriptStruct)
{
OutputDebugStringA("SetFunctionStruct\n");
_scriptStruct->getConnectionName(123); // <- Здесь я пытаюсь вызвать функцию из Delphi
return true;
}
7. Запускаю проект L2Ph через дебагер, подключаю плагин.
Мы приходим в точку останова функции
Код:
function TPluginStructClass.getConnectionName(id: integer): string; stdcall;
begin
result := dmData.ConnectNameById(id); /// <- вызывается
end;
После чего просиходит креш