2012-03-30 72 views
0

我有一個DLL,與導出函數:Delphi和C++,DLL進口

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

如何導入德爾福項目的功能?

這似乎是這樣的:

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

但是關於雙數組是什麼?如何寫下來?我該如何調用這個函數?

+4

這是一個C++成員函數。你需要一個C風格的函數。呼叫約定是什麼?你確定它是'stdcall'?另外,不可能說如何用這些信息來調用它。只有你可能知道。例如,可以使用'double * results'來返回一個值或一個數組。這是什麼? – 2012-03-30 18:39:41

+0

結果應該是一個double的數組。 – user1303931 2012-03-30 18:46:02

回答

1

results參數是一個雙精度數組。假設,爲了論證,數組有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++函數看起來是一個成員函數。您可以通過在所有其他參數之前向CalculateMC添加一個額外參數來調用Delphi,該參數包含一個指向C++對象實例的指針。但是,您需要一種方法來獲得該實例。顯然,你必須在Delphi代碼中修改CalculateMC的聲明。推測你的DLL會導出一個返回新創建實例的函數。

另一個可能的問題是,您在Delphi導入中指定了stdcall,但在C++代碼中沒有這樣做。如果您正在編譯C++,並且選擇使用stdcall作爲您的函數,那麼接口將匹配。否則,你不能從Delphi調用這個代碼,因爲MS thiscall在Delphi中沒有直接的等價物。我會爲您的C++代碼添加一個明確的__stdcall

+0

「你可以從德爾福那裏打電話給我......」我不同意。成員函數使用的'thiscall'調用約定在ECX中傳遞'this'指針,而不是'stdcall'放置第一個參數的地方。 – 2012-03-30 19:02:31

+0

@BenVoigt別管這個'this'指針,如果不匹配,所有參數都會關閉。我假設C++ DLL被編譯爲使用'stdcall'來執行此功能。顯然調用約定有匹配。除此之外,無論使用哪種約定,您都需要提供'this'指針作爲額外的參數。無論如何,我現在增加了一個討論調用約定的段落。附:目前休斯敦的天氣如何,我將在幾周內拜訪! – 2012-03-30 19:06:14

+2

@Ben,我寫了代碼來解決這個問題。查看我的導入單元的[無窗口豐富編輯控件](http://www.cs.wisc.edu/~rkennedy/windowless-rtf),其中Microsoft忽略爲接口使用stdcall。 – 2012-03-30 19:13:58