Autor Beitrag
taxidriver
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.09.11 16:31 
Hallo zusammen,

einige von euch kennen bestimmt die Funktion einen Methodenzeiger in Funktionszeiger umzuwandeln.

www.swissdelphicente...showcode.php?id=1671

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
function MakeProcInstance(M: TMethod): Pointer;
begin
  // allocate memory
  GetMem(Result, 15);
  asm
    // MOV ECX, 
    MOV BYTE PTR [EAX], $B9
    MOV ECX, M.Data
    MOV DWORD PTR [EAX+$1], ECX
    // POP EDX
    MOV BYTE PTR [EAX+$5], $5A
    // PUSH ECX
    MOV BYTE PTR [EAX+$6], $51
    // PUSH EDX
    MOV BYTE PTR [EAX+$7], $52
    // MOV ECX, 
    MOV BYTE PTR [EAX+$8], $B9
    MOV ECX, M.Code
    MOV DWORD PTR [EAX+$9], ECX
    // JMP ECX
    MOV BYTE PTR [EAX+$D], $FF
    MOV BYTE PTR [EAX+$E], $E1
  end;
end;


Allerdings funktioniert das unter 64bit leider gar nicht mehr. Habe einiges rumprobiert und gelesen, aber ich bekomme es einfach nicht hin.

Die "Calling Conventions" haben sich unter 64bit geändert so das der alte Weg nicht mehr funktioniert. Bin aber nicht der Experte um zu verstehen was genau und wie die kleine Funktion umzubauen ist.

Kann mir einer vielleicht helfen oder hat bereits einer eine neue Lösung.


Moderiert von user profile iconNarses: Topic aus Windows API verschoben am Di 27.09.2011 um 17:14
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.09.11 17:09 
Hallo und :welcome:

Das wird so einfach eventuell gar nicht mehr gehen. Denn da hat sich schon eine Menge geändert. Klar ist: Ein Assemblerblock muss jetzt über die ganze Methode gehen ohne begin davor. Mischen mit Delphicode geht nicht.

Ich hatte hier mal eine Delphi-only Variante gepostet:
www.delphipraxis.net...tem-exception.html#5

Die Assemblerbefehle, die in den Speicherbereich geschrieben werden, müssten auf jeden Fall noch angepasst werden und ob es dann geht, keine Ahnung. Vielleicht schaue ich da einmal drüber, aber ich weiß noch nicht wann.
taxidriver Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.09.11 18:13 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome:

Das wird so einfach eventuell gar nicht mehr gehen. Denn da hat sich schon eine Menge geändert. Klar ist: Ein Assemblerblock muss jetzt über die ganze Methode gehen ohne begin davor. Mischen mit Delphicode geht nicht.

Ich hatte hier mal eine Delphi-only Variante gepostet:
www.delphipraxis.net...tem-exception.html#5



:lol: danke, aber leider war ich soweit auch schon selber ... wollte aber das "orignal" so stehen lassen und als Ausgangspunkt für eine Lösung nehmen.

Wäre schade dort keine neue Lösung zu bekommen. Sonst muss ich einiges an meinem Projekt umbauen und erstmal umdenken. Hab diese Funktion sehr oft benutzt und dachte mal schnell mit dem 64bit Compiler kompiliert und los gehts...

das war wohl nichts :(
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 27.09.11 18:19 
Eins muss dir klar sein:
Selbst wenn du jetzt eine Lösung dafür findest / bekommst wirst du dann wieder basteln müssen, wenn du für andere Plattformen kompilieren möchtest. Sei es iOS, Android, oder auch irgendwann Windows 8 mit ARM.

Deshalb ist das so oder so keine gute Lösung.

Ich schaue aber dennoch mal, ob ich es bei mir zum Laufen bekomme.