Entwickler-Ecke
Algorithmen, Optimierung und Assembler - API-Übersetzung C++ => Delphi; Problem: Variable Paramete
LigH - Mo 01.08.05 22:44
Titel: API-Übersetzung C++ => Delphi; Problem: Variable Paramete
Hallo, werte Gemeinde.
Ich würde gern die AviSynth-Header von C++ nach Delphi übersetzen, um auch mit Delphi AviSynth-Plugins programmieren zu können. Dabei macht mir allerdings eine Methode einer Interface-Klasse Schwierigkeiten:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| class IScriptEnvironment { public: virtual __stdcall ~IScriptEnvironment() {}
// ...
virtual char* __stdcall Sprintf(const char* fmt, ...) = 0;
// ... }; |
Mit dem Teil "
, ...)" kann man in C++ erreichen, dass eine beliebige Anzahl von Parametern übergeben werden darf. Delphi unterstützt exakt diese Art von Deklaration selbstverständlich nicht; eventuell gibt's aber einen Trick, mit dem man das entweder nachahmen kann - oder jemand findet vielleicht in den Headern einen Hinweis darauf, dass die Implementation eventuell gar nicht wirklich notwendig wäre?!
Ich hoffe, dass diese Farge nicht allzu sehr über den "üblichen Rahmen" dieses Boards hinausgeht. ;)
Den einzigen Trick, den ich bisher woanders gefunden hatte, war einer mit prozeduralen Variablen, allerdings scheint es mir, dass der technisch nicht identisch mit der variablen Parameterliste in C++ ist.
alzaimar - Fr 05.08.05 11:52
In Delphi macht man das z.B so (geht auch anders):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure Foo (Parm : Array Of Const); Begin End;
Procedure SampleCall; Begin Foo ([1.23, true, 'blub']); ... End; |
AndyB - Fr 05.08.05 14:28
Nur ist der Array-Parameter nicht zum Ellipse-Parameter kompatibel.
Seit wann unterstützt __stdcall dann Ellipse-Parameter? Bzw. das macht man einfach nicht mit __stdcall. Dafür ist __cdecl gedacht, denn bei __stdcall weiß der Aufgerufene ja nicht, wieviele Parameter er denn nun bekommen hat, was beim Verlassen der Funktion dann zu einem zerstörten Stack führt.
Bei __cdecl würde das dann in Delphi so aussehen:
Delphi-Quelltext
1:
| function Sprintf(fmt: PChar); varargs; cdecl; |
LigH - Fr 05.08.05 14:41
AndyB hat folgendes geschrieben: |
| Bzw. das macht man einfach nicht mit __stdcall. Dafür ist __cdecl gedacht, denn bei __stdcall weiß der Aufgerufene ja nicht, wieviele Parameter er denn nun bekommen hat, was beim Verlassen der Funktion dann zu einem zerstörten Stack führt. |
Schön zu wissen; das könnte ich ja dann den Entwicklern von AviSynth erklären, die für den C++-Header verantwortlich sind; ich war daran nicht beteiligt. :roll:
Aber wie auch immer - was mich vermutlich noch eher interessieren würde: Bisher gehe ich davon aus, dass ich eventuell die Funktion nicht mal implementieren muss - ich will nur eine kompatible Deklaration, um den Typ anbieten zu können. Stimmt das, oder liege ich da eventuell daneben, und es wird doch schwieriger?
alzaimar - Fr 05.08.05 18:50
Arggh.... Da stand doch glatt 'Übersetzen von C++Headern'... Na ja, frisch aus dem Urlaub aber mental immernoch ab Strand... Man verzeihe mir.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!