Delphi和C ++,dll导入

时间:2012-03-30 18:35:30

标签: c++ delphi 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'; 

但是一个双数组怎么样?怎么写下来?我应该如何调用该函数?

1 个答案:

答案 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