2012-03-30 80 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