@JamesTKirk
Thank you man, but pushq is an invalid operand.
Below is actually the code that worked in Delphi, and I am trying to port it to Laz.
Weird thing is, x64 push raises a silent
exception and on x86 it crashes the app. I have tried many variations and yet no result.
Please if anyone knows what is wrong, help me. Or if anyone has a diff solution for calling
dll's dynamically with dynamic parms, please let me know.
I am trying to make this work on Lazaruz 0.90, for x64 and x86 on Win, Lin, and Mac.
Code:
function DynamicDllCallName(
Dll: String; const Name: String; HasResult: Boolean; var Returned: Cardinal; const Parameters: array of Pointer): Boolean;
var
prc: Pointer;
x, n: Integer;
p: Pointer;
dllh: THandle;
begin
dllh := GetModuleHandle(PChar(
Dll));
if dllh = 0 then begin
dllh := LoadLibrary(PChar(
Dll));
end;
if dllh <> 0 then begin
prc := GetProcAddress(dllh, PChar(Name));
if Assigned(prc) then begin
n := High(Parameters);
if n > -1 then begin
x := n;
repeat
p := Parameters[x];
asm
PUSH p
end;
Dec(x);
until x = -1;
end;
asm
CALL prc
end;
if HasResult then begin
asm
MOV p, EAX
end;
Returned := Cardinal(p);
end else begin
Returned := 0;
end;
end else begin
Returned := 0;
end;
Result := Assigned(prc);
end else begin
Result := false;
end;
end;