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.
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? –
Ergebnisse sollten ein Array von Doppel sein. – user1303931