Autor Beitrag
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Mo 01.08.05 22:44 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 05.08.05 11:52 
In Delphi macht man das z.B so (geht auch anders):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure Foo (Parm : Array Of Const);
Begin
  // Zugriff auf die Parameter über Parm[i]
  // Anzahl der Parameter abfragen über Length (Parm)
End;

Procedure SampleCall;
Begin
  Foo ([1.23, true, 'blub']);
...
End;
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
function Sprintf(fmt: PChar); varargscdecl;					

_________________
Ist Zeit wirklich Geld?
LigH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Fr 05.08.05 14:41 
user profile iconAndyB 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.