我有一个带导出功能的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';
但是一个双数组怎么样?怎么写下来?我应该如何调用该函数?
答案 0 :(得分: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 ++函数似乎是一个成员函数。您可以在所有其他参数(包含指向C ++对象实例的指针)之前向CalculateMC
添加一个额外参数,从Delphi调用它。但是你需要一种方法来掌握那个实例。显然,你必须在Delphi代码中修改CalculateMC
的声明。据推测,您的DLL将导出一个返回新创建的实例的函数。
另一个可能的问题是你在Delphi导入中指定了stdcall
但在C ++代码中没有这样做。如果您正在使用stdcall
选项编译C ++,那么接口将匹配。否则你根本无法从Delphi调用这段代码,因为MS thiscall
在Delphi中没有直接的等价物。我会在您的C ++代码中添加一个明确的__stdcall
。