Тема: L2PacketHack 3.5.x
Показать сообщение отдельно
Старый 15.09.2015, 00:15   #1426
Новичок
 
Регистрация: 18.05.2013
Сообщений: 13
Сказал Спасибо: 4
Имеет 0 спасибок в 0 сообщенях
VitaminPSG пока неопределено
Лампочка

Вопрос как правильно передать параметры в функцию вызванную из 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;
После чего просиходит креш
VitaminPSG вне форума   Ответить с цитированием