`

VC调用Delphi的DLL时遇到的问题及解决

 
阅读更多

在开发的过程,有时会遇到用VC调用Delphi的DLL的时候:

1、调用过程

Delphi的DLL不是标准的DLL,所以,VC调用时会有限制。

大致包括过程:

1) 声明指向函数的指针,并定义函数指针;

typedef BOOL (__stdcall * lpPlateTemplateFun)(double *, PWCHAR);//导入模板DLL函数

lpPlateTemplateFun PlateTemplateFun; //函数指针

注意:这里的调用方式要用__stdcall;没有这个Delphi的DLL,VC调用会出错。

2) 导入动态链接库(DLL),一般是动态导入(因为Delphi默认生成是DLL没有LIB,但也可以转)

hDll = LoadLibrary(_T("recognise_plate.dll"));//导入DLL

if (NULL == hDll)
{
AfxMessageBox(_T("导入DLL失败"));
return ;
}
else
{
AfxMessageBox(_T("导入DLL成功"));
}

3) 获取DLL的接口函数,并用指针指向

PlateTemplateFun = (lpPlateTemplateFun)GetProcAddress(hDll,"Template_Data");/

if(NULL==PlateTemplateFun)
{
AfxMessageBox(TEXT("获取DLL(Template_Data)地址失败!"));
return ;
}
else
{
AfxMessageBox(TEXT("获取DLL(Template_Data)地址成功!"));
}

4) 调用DLL接口函数

if(PlateTemplateFun(D3Array,C_Data))//调用接口
{

。。。

}

2、传递数组、缓存或指针地址

再次重申,Delphi的DLL不是标准的DLL,其内存数组的结构和VC的数组的结构不一致,所以,VC和Delphi之间不能直接传递数组(了解不深,见谅!暂可这么理解,如有高手愿听详解)。

那是不是说在VC和Delphi之间就不能传递类似数组的缓存区了呢?

答案是可以传递的。

他们之间传递一定要用“地址”进行传递,即传递的是地址。

比如:VC中开辟一块缓存区(可以是栈空间(比如数组);可以是堆空间(比如用molloc或new申请的空间)),进行初始化后(默认是随机值,最好进行这步),将地址传递给Delphi,Delphi收到地址,进行填充数据,传递回来。

上面是例子,是我实战中的例子,没有改动。传递的就是指针地址(我用的是堆空间)。

有人说了,你刚才说了,不能传递数组,后来你又传递数组,这不是前后矛盾吗?

NO!我前面说的是不能直接传递数组,意思是在让你在思想上放弃传递数组的概念,传递是的地址!!!

下面是我用到的地址的定义:

double *D3Array;//
int g_iDataLength=40;
PWCHAR C_Data;
C_Data = new WCHAR[g_iDataLength];
memset(C_Data,0,g_iDataLength);


D3Array = new double[100*100*100];

memset(D3Array,0,100*100*100);

这些是我给公司做程序时的全部代码,全部贴出来了。其实,我们之前传递的就是用数组,我的同事用Delphi,我用VC,他用Delphi调用他的DLL没问题;我开辟了一块内存,向另一个VC函数传递数组也没问题。问题就出在Delphi和VC之间数组的不通用上了。

我们解决这个问题正好用了一周,相信还有许多朋友遇到了类似的问题,希望本文能给您提供帮助,也好不白费我的一片苦心。

本人水平有限,望见谅!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics