Показать сообщение отдельно
Старый 10.07.2008, 09:24   #1
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию L2PacketHack 3.1.8 AE (Advanced Edition)

Итак после ряда терзаний мозга и т.д. получилось сваять ПНХ с поддержкой длл, более-менне стабильно. Разработано совместно с Гринчем. Итак приступим:

Теперь в ПНХ (весия 3.1.8) исть 2 штуки для работы с длл - процедура и функция. Обо всем по-порядку:

Процедура: CallPr
Исходный текст:
delphi Код:
if MethodName = 'CALLPR' then begin     @TestProc := nil;     @TestProc := GetProcAddress(Cardinal(Params[0]),PAnsiChar(VarToStr(Params[1])));     if @TestProc <> nil then begin       Count := Params[2];       setLength(popa,count);       for i:=0 to Count-1 do       popa[i]:=PChar(VarToStr(Params[3][i]));       TestProc(popa);     end;        @TestProc:=nil;   end else //еще в раздел переменных функции TL2PacketHackMain.CallMethod добавить //TestProc: procedure (ar:array of PChar);stdcall;  
Добавление метода в фаст скрипт:
delphi Код:
fsScript.AddMethod('procedure CallPr(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant)',CallMethod);

Функция: CallFnc
Исходный текст:
delphi Код:
if MethodName = 'CALLFNC' then begin       @TestFunc := nil;       @TestFunc := GetProcAddress(Cardinal(Params[0]),PAnsiChar(VarToStr(Params[1])));        if @TestFunc <> nil then begin         Count := Params[2];         setLength(popa,count);         for i:=0 to Count-1 do         popa[i]:=PChar(VarToStr(Params[3][i]));         Result:=StrPas(TestFunc(popa));       end;          @TestFunc:=nil;     end else //еще в раздел переменных функции TL2PacketHackMain.CallMethod добавить //TestFunc: function (ar:array of PChar):Pchar;stdcall;  
Добавление метода в фаст скрипт:
delphi Код:
fsScript.AddMethod('function CallFnc(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant):string',CallMethod);

использование: при создании дллки описание должно выглядеть
для процедуры
delphi Код:
procedure MyNazvanie(s:array of PChar);stdcall;export; var param1:integer; param2:string; begin param1:=StrToInt(StrPas(s[0])); param2:=StrPas(s[1]); end;

для функции
delphi Код:
function MyNazvanie(s:array of PChar):PChar;stdcall;export; var param1:integer; param2:string; begin param1:=StrToInt(StrPas(s[0])); param2:=StrPas(s[1]); Result:=PChar(IntToStr(param1)+' '+param2); end;

З.Ы. CallFnc возвращает string;

З.Ы.Ы. TestDLL - тестовая дллка и скрипт для передачи/приема различных данных, Temp_Project - для передачи пакета в дллку (полностью) и разбор пакета уже непосредственно в дллке.

З.Ы.Ы.Ы. в ПНХ добавлена функция StrToHex, чтоб посылать пакет в дллку нужно обязательно его в хекс перевести иначе возникает проблемма в преобразовании типов и пакет передается не полностью.

З.Ы.Ы.Ы.Ы. Большое спасибо модерам и админу за помощь в создании сего продукта =) Гринч, выкинь сюда весь исходник и перекомпиленную пнх, последнюю, ну ты знаешь какую =)
Вложения
Тип файла: rar l2pbxAE.rar (662.6 Кб, 2431 просмотров)
Тип файла: rar Testdll.rar (213.0 Кб, 438 просмотров)
Тип файла: rar Temp_Project.rar (177.3 Кб, 417 просмотров)

Последний раз редактировалось QaK, 17.07.2008 в 11:15.
QaK вне форума   Ответить с цитированием
За это сообщение QaK нажился 7 спасибками от: