2012-03-30 14 views
0

Ich habe eine DLL, mit exportierte Funktion:Delphi und C++, Import dll

int HCalculator::CalculateMC(const char* h, const char* b, const char* d, __int64 numberOfTrials, double* results) 

Wie diese Funktion in Delphi-Projekt importieren?

Es scheint so zu sein:

function CalculateMC(h, b, d: PChar; numberOfTrials: int64; results: ???): integer; stdcall; external 'MYDLL.DLL'; 

Aber was ist ein Array von Doppel? Wie schreibe ich es auf? Und wie soll ich diese Funktion nennen?

+4

Das ist eine C++ - Memberfunktion. Sie benötigen eine C-Style-Funktion. Was ist die Aufrufkonvention? Bist du sicher, dass es "stdcall" ist? Es ist auch unmöglich zu sagen, wie man es mit diesen Informationen nennt. Nur du kannst es vielleicht wissen. Zum Beispiel könnte 'double * results' verwendet werden, um einen einzelnen Wert oder ein Array zurückzugeben. Welches ist es? –

+0

Ergebnisse sollten ein Array von Doppel sein. – user1303931

Antwort

1

Der Parameter results ist ein Array von Doubles. Angenommen, das Array hat numberOfTrials Elemente. Dann würden Sie die DLL wie folgt aufrufen:

function CalculateMC(h, b, d: PChar; numberOfTrials: int64; 
    results: PDouble): integer; stdcall; external 'MYDLL.DLL'; 
..... 
var 
    returnVal: integer; 
    results: array of Double; 
..... 
SetLength(results, numberOfTrials); 
returnVal := CalculateMC(h, b, d, numberOfTrials, @results[0]); 

Ein großes Problem, das ich sehe, ist, dass Ihre C++ Funktion eine Member-Funktion zu sein scheint. Sie könnten das von Delphi aus aufrufen, indem Sie vor allen anderen Parametern, die einen Zeiger auf die C++ Objektinstanz enthielten, einen zusätzlichen Parameter zu CalculateMC hinzufügen. Aber Sie würden einen Weg brauchen, um diese Instanz zu erreichen. Und natürlich müssten Sie die Deklaration CalculateMC in Ihrem Delphi-Code ändern. Vermutlich würde Ihre DLL eine Funktion exportieren, die eine neu erstellte Instanz zurückgibt.

Ein anderes mögliches Problem ist, dass Sie stdcall in Ihrem Delphi-Import angegeben haben, aber nicht in dem C++ - Code. Wenn Sie C++ mit der Option stdcall für Ihre Funktionen kompilieren, werden die Schnittstellen übereinstimmen. Ansonsten können Sie diesen Code überhaupt nicht aus Delphi aufrufen, da MS thiscall in Delphi keine direkte Entsprechung hat. Ich würde eine explizite __stdcall zu Ihrem C++ Code hinzufügen.

+0

"Sie könnten das von Delphi aus anrufen ..." Ich stimme nicht zu. Die 'thiscall'-Aufrufkonvention, die von Elementfunktionen verwendet wird, übergibt den" this "-Zeiger in ECX, wo" stdcall "den ersten Parameter nicht platziert. –

+0

@BenVoigt Vergessen Sie den "This" -Zeiger nicht, alle Params wären ausgeschaltet, wenn es eine Abweichung gab. Ich nahm an, dass die C++ DLL kompiliert wurde, um 'stdcall' für diese Funktion zu verwenden. Offenbar müssen die Konferenzkonventionen übereinstimmen. Darüber hinaus müssten Sie den "this" -Zeiger als zusätzlichen Parameter angeben, unabhängig davon, welche Konvention verwendet wurde. Jedenfalls habe ich jetzt einen Absatz hinzugefügt, in dem die Aufrufkonvention besprochen wird. P.S. Wie ist das Wetter in Houston im Moment, ich werde in ein paar Wochen besuchen! –

+2

@Ben, ich habe Code geschrieben, um dieses Problem zu umgehen. Siehe meine Importeinheiten für das [fensterlose Rich-Edit-Steuerelement] (http://www.cs.wisc.edu/~rkennedy/windowless-rtf), wo Microsoft es versäumte, stdcall für die Schnittstellen zu verwenden. –

Verwandte Themen