AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

thiscall calling convention

Ein Thema von Sunec · begonnen am 15. Aug 2015 · letzter Beitrag vom 16. Aug 2015
Antwort Antwort
Sunec

Registriert seit: 31. Aug 2013
88 Beiträge
 
Delphi XE8 Architect
 
#1

AW: thiscall calling convention

  Alt 16. Aug 2015, 04:50
Du meinst die Methoden als virtual zu kennzeichnen?

Hab ich leider auch schon vergeblich versucht. Die Funktion liefert ohne den asm "Schnipsel" den falschen Rückgabewert.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: thiscall calling convention

  Alt 16. Aug 2015, 11:46
Zitat:
Du meinst die Methoden als virtual zu kennzeichnen?
Nein Ich meine TDispatchableVtbl.

gruss
  Mit Zitat antworten Zitat
Sunec

Registriert seit: 31. Aug 2013
88 Beiträge
 
Delphi XE8 Architect
 
#3

AW: thiscall calling convention

  Alt 16. Aug 2015, 13:43
Zitat:
Du meinst die Methoden als virtual zu kennzeichnen?
Nein Ich meine TDispatchableVtbl.

gruss
Da ich davon noch nie gehört habe, hab ich mal das G von Alphabet befrage:
http://foren.activevb.de/cgi-bin/for...msg=404151&id=

Allerdings keine Ahnung wie mir das weiterhelfen soll
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: thiscall calling convention

  Alt 16. Aug 2015, 14:17
Zitat:
Du meinst die Methoden als virtual zu kennzeichnen?
Nein Ich meine TDispatchableVtbl.

gruss
Da ich davon noch nie gehört habe, hab ich mal das G von Alphabet befrage:
http://foren.activevb.de/cgi-bin/for...msg=404151&id=

Allerdings keine Ahnung wie mir das weiterhelfen soll
Du hast aber schon gelesen ?
stdcall; // Microsoft's thiscall (ecx = this)

und das du den Pointer deiner nicht statischen C++ Methode
hier geliefert bekommst?
AReturn : Pointer; // Pointer to buffer of return value

Von daher dachte ich das es dir vielleicht helfen könnte (andere Methode halt)
Wenn nicht gut dann habe ich wohl was falsch verstanden.
Kein Beinbruch meinerseits.

gruss
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#5

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:04
Ich hatte auch mal damit zu tun und habe es folgendermaßen gelöst:

Delphi-Quellcode:
type
  PCppClass = ^TCppClass;
  PCppClassVtbl = ^TCppClassVtbl;
  TCppClassVtbl = packed record
    // These are actually Microsoft "thiscall" convention functions that pass a C++ object reference
    // in the ecx register. Delphi doesn't support this calling convention, but in its default
    // "register" calling convention, it passes the first three parameters in eax, edx, ecx, and
    // the rest on the stack. So, by prepending two integer dummies, we can abuse this to fake
    // a thiscall. However, thiscall passes parameters on the stack from right to left, whereas
    // Delphi register uses left to right. Therefore, the order of the parameters after "This"
    // has to be reversed!
    method0: function (Dummy0, Dummy1: Integer; This: PCppClass; hWin: HWND): Boolean;
    method1: function (Dummy0, Dummy1: Integer; This: PCppClass; Arg2, Arg1: Integer): Boolean;
    method2: function (Dummy0, Dummy1: Integer; This: PCppClass): Boolean;
    method3: function (Dummy0, Dummy1: Integer; This: PCppClass; Arg3: Pointer; Arg2, Arg1: Integer): Boolean;
  end;
  TCppClass = packed record
    Vtbl: PCppClassVtbl;
  end;
Erklärung:
Ich habe eine externe in C++ geschriebene DLL, die in einer Funktion eine C++ Klasse zurückliefert und zwar in Form eines Pointers (PCppClass).
Der Pointer zeigt auf eine Datenstruktur, die ihrerseits an erster Stelle einen Pointer auf die Virtual Method Table (Vtbl) hat.
Die Vtbl ist quasi ein Array mit Prozedur/Funktionszeigern (definiert in TCppClassVtbl), die alle die thiscall Aufrufkonvention haben.

Wie im englischen Kommentar beschrieben ist der Trick folgender:
Delphis normale Aufrufkonvention ist "register", d.h. die ersten 3 Parameter werden wenn möglich in den Registern eax, edx, ecx übergeben, in dieser Reihenfolge. Erst ab dem 4. Parameter wird der Stack benutzt. Dagegen benutzt "thiscall" nur ecx für die Klassen/Objektreferenz ("this" is C++, wie "Self" in Delphi) und den Stack für den Rest.
Wenn man also einen thiscall-Aufruf als register-Aufruf definiert, mit zwei initialen Dummy-Parametern, um eax und edx zu füllen, dann kann man auf diese Weise einen thiscall emulieren.
Ein weiterer Unterschied dabei ist, dass "thiscall" die Parameter von rechts nach links auf den Stack legt (wie bei "stdcall"), "register" allerdings von links nach rechts. Das muss man kompensieren, indem man in jeder Methode der Vtbl die Parameter nach "This" einfach in umgekehrter Reihenfolge deklariert im Vergleich zum C++ Original.

Delphi-Quellcode:
// Aufruf ungefähr so:
var
  P: PCppClass;

P := GetClass();
P^.Vtbl^.method0(0, 0, P, Form1.Handle); // die "^" kann man sich in neueren Delphi-Versionen auch sparen

Geändert von SMO (16. Aug 2015 um 17:42 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:07
Ist doch quasi das gleiche wie bei mir.
So wie ich es vorgeschlagen habe.
Von dir jedoch um einiges besser beschrieben

gruss
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#7

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:10
Ist doch quasi das gleiche wie bei mir.
Ist es das? Sehe ich nicht so (stdcall vs. register), aber vielleicht stehe ich gerade auf dem Schlauch.

Von dir jedoch um einiges besser beschrieben
Danke.

Geändert von SMO (16. Aug 2015 um 15:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:32 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 by Thomas Breitkreuz