2012-03-30 13 views
0

をインポート:DelphiとC++、DLLがエクスポートされた関数で、私はDLLを持って

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

はどのようにDelphiのプロジェクトでその機能をインポートしますか?

次のようであるように思わ:

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

しかし、どのような二重の配列についてはどうですか?どのようにそれを書き留める?そして、私はその関数をどのように呼び出すべきですか?

+4

これはC++のメンバー関数です。あなたはCスタイルの関数が必要です。呼び出し規約は何ですか?確かに 'stdcall'ですか?また、この情報でどのように呼び出すこともできません。あなただけが知っている可能性があります。たとえば、 'double * results'を使用して単一の値または配列を返すことができます。どちらですか? –

+0

結果はdoubleの配列である必要があります。 – user1303931

答えて

1

resultsパラメータは、2倍の配列です。議論のために、配列にnumberOfTrials要素があるとします。そして、あなたはこのようにDLLを呼び出します。私は見

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]); 

一つの大きな問題は、あなたのC++関数はメンバ関数のように見えるということです。 Delphiから呼び出すには、CalculateMCに追加のパラメータを追加してから、C++オブジェクトインスタンスへのポインタを含む他のすべてのパラメータを追加します。しかし、あなたはそのインスタンスを取得する方法が必要になります。そして明らかに、あなたのDelphiコードでCalculateMCの宣言を変更する必要があります。おそらくあなたのDLLは、新しく作成されたインスタンスを返す関数をエクスポートするでしょう。

もう1つの可能性のある問題は、Delphiのインポートにstdcallを指定していますが、C++コードではそうしていない可能性があります。関数にstdcallを使用するオプションを指定してC++をコンパイルする場合、インタフェースは一致します。それ以外の場合は、MS thiscallには、Delphiで直接同等の機能がないため、このコードをDelphiから呼び出すことはできません。あなたのC++コードに明示的に__stdcallを追加します。

+0

「あなたはデルファイからそれを呼び出すことができます...」私は同意しません。メンバ関数によって使用される 'thiscall'呼び出し規約は、' stdcall'が最初のパラメータを置く場所ではない 'this'ポインタをECXに渡します。 –

+0

@BenVoigt 'this'ポインタを気にしないでください。不一致があった場合、すべてのパラメータはオフになります。私はC++ DLLがこの関数に 'stdcall'を使うようにコンパイルされていると仮定していました。明らかに呼び出し規約は一致しています。それを超えると、どのコンベンションが使用されていたとしても、 'this'ポインタを余分なパラメータとして指定する必要があります。とにかく、私は、現在、呼び出し規約について議論している段落を追加しました。 P.S.現時点でヒューストンの天気はどうですか、私は数週間で訪れることになります! –

+2

@Ben、私はその問題を回避するコードを書いています。 [ウィンドウレスのリッチエディットコントロール](http://www.cs.wisc.edu/~rkennedy/windowless-rtf)のインポートユニットを参照してください。マイクロソフトはインターフェイスにstdcallを使用することを怠っていました。 –

関連する問題