帮助解决从dll中导入函数的问题 - 页 2

 

我在一个H文件中写了一些东西


extern __declspec( dllexport) int __stdcall GetIntValue(int);

然后在cpp中只要


int __stdcall GetIntValue(int)
 
也许关键字extern 会有帮助。
 
alsu >> :

...


......而且我宁愿完全不和弦子打交道......。为什么你需要他们在所有的D中呢?

而Borland自己也建议在必要时使用char*或char[],Metatrader风格。

 

我认为在构建器中声明它的正确方法如下(我不记得具体内容了)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

我认为在构建器中声明这样的内容是正确的(我不记得具体内容了)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

在那里!完全正确。

 

非常感谢您的提示!在extern "C" int __declspec(dllexport) __stdcall GetIntValue()之后,它与这个例子一起工作。

我试着用double和string函数,结果也成功了。我决定将我从你那里获得的知识应用于一项实际的任务。但可惜的是...不幸的是,我没有成功。

如果你能,请再帮我一次。

在Bilder项目 中有这些用于创建DLL的文件:UHsvd.h,Usvd.cpp和其他文件。

UHsvd.h文件中有一个应该在以后导出的函数。

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt) 。

Usvd.cpp文件包含相同的函数,然后应该导出该函数。

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt。)

{

........

}

我在这个变体中开始在Bilder中构建一个DLL,一切都在 "构建",一切都在工作,没有错误。

如果我开始对UHsvd.h、Usvd.cpp进行修改,如

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....),然后在不同的变体上出现了从2到19的错误,也就是说,我在头文件或cpp中做了这个声明...尽管据我所知,它应该在头文件中(那么只有2个错误)。

[BCC32 Error] Usvd.cpp(128): E2356 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)' 的重新声明中出现类型不匹配
[BCC32 Error] UHsvd。h(111): E2344 较早声明'__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'

根据我的理解,有一个差异...但我并不完全理解...:-(

真的希望得到您的帮助和支持......

 

boysn писал(а) >> {...}

如果你可以,请再帮一次忙。

在Bilder项目中,有一些创建DLL的文件:UHsvd.h、Usvd.cpp和其他文件。

UHsvd.h文件中有一个函数,然后必须导出。

bool rmatrixsvd(ap::real_2d_array a。
int m,
int n,
int uneeded,
int vtneeded,
额外的内存(int additionalmemory)。
ap::real_1d_array& w,
ap::real_2d_array&。
ap::real_2d_array& vt); {...}

如果我理解正确,ap::real_1d_array是一个类。而ap::real_1d_array &是对一个类对象的引用。

但亲爱的,你只能把双倍的myData[]作为参数传给Dll。

这在函数中看起来会像双*。

 
jartmailru писал(а)>>

如果我理解正确,ap::real_1d_array是一个类。而ap::real_1d_array &是对类对象的引用。

但亲爱的,只有双倍的myData[]可以作为参数传给Dll。

在函数中,它看起来像双*。

我完全同意你的观点。在导入时,我会在MQL中声明它为双倍。但目前我在C++ Builder 2009中创建DLL本身时遇到了困难。我在构建时得到了错误。如果我不使用声明

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) 然后Bilder中的库编译成功通过,没有任何问题。现在,我不知道如何在Bilder项目中正确创建导出函数的声明:-(,以便获得

具有导出rmatrixsvd函数能力的工作DLL。

 
boysn >> :

我完全同意你的观点。在导入时,我将在MQL中把它声明为双倍。但目前我在C++ Builder 2009中创建DLL本身时遇到了困难。我在构建时得到了错误。如果我不使用声明

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) 那么这个库在Bilder中编译成功,没有问题。现在,我不知道如何在Bilder项目中正确创建导出函数的声明:-(,以便获得

工作DLL具有导出rmatrixsvd函数的能力。

呲呲呲。你似乎很奇怪地同意我的看法。

.

事实上,我们正在谈论写 "适配器 "或 "桥"。

从导出的函数参数的角度来看,"适配器 "是指

必须与可由元交易商传递的参数相匹配。

...也就是说,你需要一个额外的函数,将调用传递到你希望它去的地方。

而从 "桥梁 "的角度来看,它的功能是不需要的

你宣布将自己做工作。

反之亦然--没有必要调用做工作的函数。

.

也就是说,你需要把接口和实现分开,也就是说,实现可以建立在类上

...以及在Dll之外的功能,没有人会知道。

.

但让我们考虑一个例子。

.

你应该像这样声明函数。

外部 "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// 当然,你也会在这里传递行和列的数量。

{

//将输入参数转换为ap::real_2d_array。

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1)。

ap::real_2d_array a2 = ;

.

//计算

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3)。

.

//将a3的结果翻译成out

convertReal2DArrayToPDouble(a3, out);

.

返回。
}

.

在这里--当然是--函数rmatrixsvd

没有被声明为extern "C "或__stdcall或__declspec等。

因为它是内部的、隐藏的实施的一部分。

 

对不起,没有完全理解,不幸的是......

http://alglib.sources.ru/,我下载了我需要的C++实现(代码)。如果你不介意,请看一下所附的100KB档案。这个算法有很多辅助函数,总的代码行数大约是3000行......我想是的

网站上是这么说的,也就是说,它太多了,而且要把它翻译成MQL是相当困难的......你必须了解算法本身,才能正确翻译它。目前,这对我来说有点复杂。这就是为什么我想用C++ Builder 2009来制作一个带有这种现成代码的dll,并从dll中调用我需要的rmatrixsvd(...)函数。这就是我感到困惑的地方...。在哪里以及如何正确申报...有了这段代码,不需要改变那里的一行,DLL就被建立了,没有错误。但只要我把extern "C" bool __declspec(dllexport) __stdcall放进去,就会出现错误。

谢谢你的时间。

附加的文件:
svdy1e.cpp.zip  94 kb