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
Seite 2 von 2     12   
SMO

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

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:40
Ich sehe nicht, wie und wo bei diesem Vorgehen das "this" in ecx landet, da stdcall benutzt wird.

Es gibt übrigens durchaus C-Methoden, die das "this" nie benutzen und daher von Delphi aus per stdcall aufgerufen werden können. Aber im allgemeinen Fall geht das nicht und man muss irgendwie dafür sorgen, dass ecx den richtigen Inhalt bekommt.

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

n/a Beiträge
 
#12

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:42
Ich sehe nicht, wie und wo bei diesem vorgehen das "this" in ecx landet, da stdcall benutzt wird.
Dann lese nochmal..

Delphi-Quellcode:
type
  PDispatchableVtbl = ^TDispatchableVtbl;
  TDispatchableVtbl = record
    Dispatch: function(
      AMessage : Integer; // Interpretation is class-dependend
      AReturn : Pointer; // Pointer to buffer of return value
      AParams : PPointerArray; // Pointer to array of data pointers
      AParamCount: Integer // Number of parameters in the array
      ): Integer; // Almost always TRUE(1) or FALSE(0)
      stdcall; // Microsoft's thiscall (ecx = this) <-----
  end;
Delphi-Quellcode:
  PDispatchable = ^TDispatchable;
  TDispatchable = record
    Vtbl: PDispatchableVtbl;
  end;
Delphi-Quellcode:
var
  This: PDispatchable;
Letztendlich wäre die frage ob es ihm was bringt da er quasi nur einen 1 Zeiler verwendet.
Wenn es denn geht warum nicht so belassen.

gruss

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

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

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:49
Ich sehe nicht, wie und wo bei diesem vorgehen das "this" in ecx landet, da stdcall benutzt wird.
Dann lese nochmal..
Ich glaube, du verstehst nicht... das ist ein Kommentar, keine Zuweisung.
Bei stdcall landen alle Parameter auf dem Stack, nicht in Registern.

Dieses Codebeispiel ist unvollständig oder funktioniert nicht. Wie gesagt, falls diese "Dispatch" Methode "this" gar nicht braucht, wird es funktionieren, aber das ist nicht der Allgemeinfall.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: thiscall calling convention

  Alt 16. Aug 2015, 15:54
Zitat:
Dieses Codebeispiel ist unvollständig
Korrekt.. Sorry kann den gesamten Quelltext nicht offenlegen.. Closed source. (Sollte auch nur als Ansporn/Alternative dienen)

Zitat:
oder funktioniert nicht
Es funktioniert und zwar sehr zuverlässig

Zitat:
falls diese "Dispatch" Methode "this" gar nicht braucht, wird es funktionieren, aber das ist nicht der Allgemeinfall.
Mag dahin gestellt sein.

gruss
  Mit Zitat antworten Zitat
SMO

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

AW: thiscall calling convention

  Alt 16. Aug 2015, 16:02
Korrekt.. Sorry kann den gesamten Quelltext nicht offenlegen.. Closed source. (Sollte auch nur als Ansporn/Alternative dienen)
Ist ja toll. Nur noch mal zur Erinnerung: Die Kernfrage von Sunec war, ob es einen besseren Weg gibt, die "this" Referenz eines thiscalls in ecx zu bekommen. Dein "Ansporn" hat da in keinster Weise geholfen, eine Lösung zu finden.
Wie es wirklich geht, habe ich gezeigt. (Ist natürlich ein Hack, aber "besser" als einen asm-Block vor jedem Methodenauruf finde ich ihn schon.)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: thiscall calling convention

  Alt 16. Aug 2015, 16:07
Das erste war ein Beispiel wo kein this verwendet wird.
Nun eins mit This die Basis ist die gleiche.

Und auch das funktioniert.

Delphi-Quellcode:
function LanguageService_Dispatch(AMessage: Integer; AReturn: Pointer;
  AParams: PPointerArray; AParamCount: Integer): Integer; stdcall;
Delphi-Quellcode:
function LanguageService_Dispatch(AMessage: Integer; AReturn: Pointer;
  AParams: PPointerArray; AParamCount: Integer): Integer; stdcall;

begin
  asm
        mov This, ecx
  end;

  Result := Ord(False);

  if not Assigned(AReturn) then
    Exit;

  ///.... bla, bla
  case AMessage of
    WASERVICEFACTORY_GETINTERFACE:
          begin
            Pointer(AReturn^) := This;
            Result := Ord(True);
          end;
  end;

end;
und so weiter.
Zitat:
Ist natürlich ein Hack, aber "besser" als einen asm-Block vor jedem Methodenauruf finde ich ihn schon.)
Dieser befindet sich innerhalb meiner Funktion.

Es ging mir bei den letzten Antworten nur darum um dir zu zeigen das deine Methode sich von meiner nur wesentlich unterscheidet.
In Kombination mit und ohne This
Aber ich vermute mal das es ihm nicht viel bringt.

Wie gesagt die Winamp_APIService komplett zu veröffentlichen geht leider nicht
da steckt viel zeit und Hirnschmalz drin. Sorry

gruss

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

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

AW: thiscall calling convention

  Alt 16. Aug 2015, 17:18
Du hast also in Delphi etwas implementiert, das von einem Aufrufer (Winamp?) benutzt werden kann, der eigentlich eine C++ Klasse bzw. thiscall erwartet.
Das ist genau das Gegenteil von dem was Sunec möchte (selbst aufrufen, nicht aufgerufen werden). Aber das Prinzip ist natürlich gleich.

Und auch dein neues Beispiel könnte mit meinem Trick "schöner" gemacht werden (kein asm, keine globale "This" Variable):

Delphi-Quellcode:
function LanguageService_Dispatch(DummyEax, DummyEdx: Integer; This: PDispatchable; AParamCount: Integer;
AParams: PPointerArray; AReturn: Pointer; AMessage: Integer): Integer; // register;

Mein Punkt war jedenfalls, dass man Delphis register Aufrufkonvention problemlos für thiscall verwenden kann, unter folgenden Bedingungen:
  1. Man braucht am Anfang der Parameterliste zwei Dummys, um eax und edx zu befüllen (Werte sind egal).
  2. Der 3. Parameter ist "this" und landet wie erforderlich in ecx.
  3. Die restlichen Parameter landen auf dem Stack, aber da register den Stack von links nach rechts befüllt, thiscall aber von rechts nach links, muss die Reihenfolge der restlichen Parameter umgedreht werden!

Aus einem hypothetischen
"function TSomeClass.Foo(Arg1, Arg2, Arg3: Integer): Integer; thiscall;"
wird also
"function Foo(DummyEax, DummyEdx: Integer; This: PSomeClass; Arg3, Arg2, Arg1: Integer): Integer; register;"


Wie gesagt die Winamp_APIService komplett zu veröffentlichen geht leider nicht
da steckt viel zeit und Hirnschmalz drin. Sorry
Verstehe, ist auch nicht nötig. Sunecs Frage sollte damit beantwortet sein, es sei denn jemand kennt einen besseren Weg, um von Delphi aus eine C-Methode mit thiscall aufzurufen.

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

n/a Beiträge
 
#18

AW: thiscall calling convention

  Alt 16. Aug 2015, 17:26
Zitat:
Du hast also in Delphi etwas implementiert, das von einem Aufrufer (Winamp?) benutzt werden kann, der eigentlich eine C++ Klasse bzw. thiscall erwartet.
Es geht um eine beliebige Anwendung welche die Visualisierungs Plugins von Winamp verwenden will.
Winamp selbst hat damit nichts zu tun.
Zitat:
Aber das Prinzip ist natürlich gleich.
Dito

Zitat:
Mein Punkt war jedenfalls, dass man auf asm verzichten kann, wenn man mit zwei "Dummy" Parametern leben kann (egal ob man sich Vtbl-Records deklariert oder nicht). Denn dann passt Delphis register Aufrufkonvention problemlos für thiscall.


Zitat:
Sunecs Frage sollte damit beantwortet sein, es sei denn jemand kennt einen besseren Weg, um von Delphi aus eine C-Methode mit thiscall aufzurufen.
Sehe ich genauso..

gruss

Geändert von EWeiss (16. Aug 2015 um 17:37 Uhr)
  Mit Zitat antworten Zitat
Sunec

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

AW: thiscall calling convention

  Alt 16. Aug 2015, 21:30
Wow ich hätte nicht gedacht eine so ausführliche und plausible Erklärung zu bekommen

Besten Dank!

Aus einem hypothetischen
"function TSomeClass.Foo(Arg1, Arg2, Arg3: Integer): Integer; thiscall;"
wird also
"function Foo(DummyEax, DummyEdx: Integer; This: PSomeClass; Arg3, Arg2, Arg1: Integer): Integer; register;"

Das klappt hervorragend und ich konnte nun alle Aufrufe problemlos ohne ASM (und mit umgestellten Parametern) aufrufen!

Spitze!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz