Итак после ряда терзаний мозга и т.д. получилось сваять ПНХ с поддержкой длл, более-менне стабильно. Разработано совместно с Гринчем. Итак приступим:
Теперь в ПНХ (весия 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, чтоб посылать пакет в дллку нужно обязательно его в хекс перевести иначе возникает проблемма в преобразовании типов и пакет передается не полностью.
З.Ы.Ы.Ы.Ы. Большое спасибо модерам и админу за помощь в создании сего продукта =) Гринч, выкинь сюда весь исходник и перекомпиленную пнх, последнюю, ну ты знаешь какую =)