AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Multi-Event-Liste

Ein Thema von Ghostwalker · begonnen am 2. Dez 2016 · letzter Beitrag vom 8. Dez 2016
 
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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz