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:
- Man braucht am Anfang der Parameterliste zwei Dummys, um eax und edx zu befüllen (Werte sind egal).
- Der 3. Parameter ist "this" und landet wie erforderlich in ecx.
- 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; Arg
3, Arg
2, Arg
1: 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.