Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Multi-Event-Liste

  Alt 4. Dez 2016, 23:07
So..hab ein wenig weiter probiert. Folgende Methode ist dabei soweit rausgekommen:

(Gekürzt...Problem ist der ASM-Teil):

Delphi-Quellcode:
procedure TEventList.CallInvoke(method: TMethod; params: array of const);
var
  :
  Regs : array[plEAX..plECX] of Cardinal;
  doStack : boolean;
  stack : array[0..1023] of Byte;
  stacksize : integer;
  sc : integer;
  p : Pointer;


begin
  Regs[plEAX] := Cardinal(Method.data);
  if (doStack) then
  begin
    fillchar(stack,sizeof(stack),0);
    StackSize := Sizeof(TVarRec)*(Length(Params));
    sc := 0;
    for I := High(params) downto Low(Params) do
    begin
      move(params[i],stack[sc],sizeof(params[i]));
      inc(sc,sizeof(params[i]));
    end;
    p := @Stack;
    asm
            SUB ESP,Stacksize
            MOV p,ESP
    end;
    Regs[plEDX] := Cardinal(p);
    Regs[plECX] := Cardinal(Stacksize);
  end
  else
  begin
    for I := 0 to MethSig.ParamCount - 1 do
    begin
      if (MethSig.parameters[i].location <> plEax) AND (MethSig.parameters[i].ParamName <> 'Self') then
         Regs[MethSig.Parameters[i].Location] := GetValueAsCardinal(params[i-1]);
    end;
  end;
  // Do the call
  asm
            MOV EAX,DWORD PTR Regs[0]
            MOV EDX,DWORD PTR Regs[4]
            MOV ECX,DWORD PTR Regs[8]
            CALL Method.code
            MOV DWORD PTR Regs[0],EAX
            MOV DWORD PTR Regs[4],EDX
  end;
End;
Zum Testen verwendig ich folgenden Aufruf:

Delphi-Quellcode:
var
  rec : TTestRec;

begin
  rec.aInteger := 55779;
  rec.aString := 'More wide string to process';
  rec.aBool := TRUE;
  fevents.Execute('TEventType5',[150,333,42,'Schweine im Weltraum oder Trampen leicht gemacht',FALSE,1.5647,'Normal String','Another very wide String',@rec,2357]);
end;
TEventType5 ist so definiert:

   TEventType5 = Procedure(v1:integer;v2:integer;v3:integer;v4:Widestring;v5:boolean;v6:double;v7:string;v8:widestring;v9:TTestRec;v10:integer) of object; Soweit so gut. Leider Schepperts beim Aufruf der obigen Methode mit diesem EvenType. Benutze ich
einen mit nur 2 oder 1 Parameter (egal was für ein Typ) funktioniert das ganze. Also hakt es mit
dem Stack-Teil. Könnte mir da jemand bitte helfen ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat