Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Delphi和C++;,dll导入_C++_Delphi_Dll - Fatal编程技术网

C++ Delphi和C++;,dll导入

C++ Delphi和C++;,dll导入,c++,delphi,dll,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;

我有一个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'; 

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

参数是一个双精度数组。为了便于论证,假设数组具有
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代码中修改
calculateEMC
的声明。您的DLL可能会导出一个返回新创建实例的函数


另一个可能的问题是,在Delphi导入中,您已经指定了 STDCALL> /COD>,但在C++代码中没有这样做。如果您正在编译C++,可以选择使用<代码> STDCALL> /COD>函数,则接口将匹配。否则,您根本无法从Delphi调用此代码,因为MS

thiscall
在Delphi中没有直接等效项。我会在C++代码中添加一个显式的<代码>“ysSTDele>”/>代码。

这是C++成员函数。你需要一个C风格的函数。电话会议是什么?您确定它是
stdcall
?而且,用这些信息也说不出如何称呼它。只有你可能知道。例如,
double*results
可用于返回单个值或数组。它是哪一个?结果应该是一个双精度数组。“你可以从Delphi中调用它…”我不同意。成员函数使用的
thiscall
调用约定在ECX中传递
this
指针,它不是
stdcall
放置第一个参数的地方。@BenVoigt不要管
this
指针,如果不匹配,所有参数都将关闭。我假设C++ DLL编译为使用这个函数的代码> STDCALL> /COD>。显然,呼叫约定具有匹配性。除此之外,无论使用哪种约定,都需要将
this
指针作为额外参数提供。不管怎样,我现在已经添加了一段讨论调用约定的内容。另外,休斯顿现在的天气怎么样,我几周后就要来了@本,我已经写了代码来解决这个问题。请参阅我的导入单元,微软忽略了使用STDCULL进行接口。@戴维:微软C++中,非静态成员函数都使用<代码>此调用< /C> >,普通函数使用<代码> CCDL> < /C> >或<代码> STDCALL> /COD>。我认为,无论使用多少关键字,成员函数的调用约定都无法改变。顺便说一句,这里的温度很好,我们有一个阴雨交加的晴天。短裤和t恤衫是明确指定的(适合晴朗的天气,另一方面干燥更快…)如果您使用我的名字作为URL,您应该能够找到我的联系信息。@BenVoigt我不确定这是否正确。阅读此MSDN页面: