![]() |
AW: thiscall calling convention
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. |
AW: thiscall calling convention
Zitat:
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:
Letztendlich wäre die frage ob es ihm was bringt da er quasi nur einen 1 Zeiler verwendet.
var
This: PDispatchable; Wenn es denn geht warum nicht so belassen. gruss |
AW: thiscall calling convention
Zitat:
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. |
AW: thiscall calling convention
Zitat:
Zitat:
Zitat:
gruss |
AW: thiscall calling convention
Zitat:
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.) |
AW: thiscall calling convention
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:
und so weiter.
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; Zitat:
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 |
AW: thiscall calling convention
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:
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;" Zitat:
|
AW: thiscall calling convention
Zitat:
Winamp selbst hat damit nichts zu tun. Zitat:
Zitat:
Zitat:
gruss |
AW: thiscall calling convention
Wow ich hätte nicht gedacht eine so ausführliche und plausible Erklärung zu bekommen :thumb:
Besten Dank! Zitat:
Das klappt hervorragend und ich konnte nun alle Aufrufe problemlos ohne ASM (und mit umgestellten Parametern) aufrufen! Spitze! :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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