在开发的过程,有时会遇到用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之间数组的不通用上了。
我们解决这个问题正好用了一周,相信还有许多朋友遇到了类似的问题,希望本文能给您提供帮助,也好不白费我的一片苦心。
本人水平有限,望见谅!
分享到:
相关推荐
演示 Delphi 调用VC DLL 参数传递
delphi可以很方便的封装第三方库,导出dll,此方法可以很方便的生成供Qt或VC调用的Lib文件,免去动态加载的麻烦,喜欢的朋友可以试下。我就是这么用的。
演示VC2008 调用DelphiXE DLL 获取IP地址地理位置信息,文件还包涵Skin++破解级50多个SSK皮肤文件,以及最近做的一个网络刷票投票工具。
VC调用Delphi DLL,并递交struct类型的参数 ,并于dll里面callback VC结构体里面的方法.
在VC中的DLL类导出以后完全是可以被delphi调用的. 源码中有详细介绍和说明文档.
详细描述Delphi 调用VC生成的DLL的方法,并有函数说明
delphi 调用vc dll 获取返回数据 mac地址,遇到的问题是delphi一直都获取不到vc返回的字符串,最后通过strcpy解决了
书上讲,如果你是用Delphi写DLL,且希望不仅给 Delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall ; //参数型态:Delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的,Windows/DLL的母语应该是C。...
关于delphi与vc.dll的相互调用,仔细看看吧
用delphi可以调用vc做的dll里的类方法,首先要调用构造函数,用ecx传类私有数据指针
本文介绍了让.NET程序兼容不同版本的Dll文件的方法:把所有的新版DLL文件拷贝到运行目录下,希望主程序能够直接调用新版的库文件。只要在config里面加入runtime节点就可以完成主程序一调用。
delphi7通过调用外部dll实现HMACSHA(用VC基于openssl写了个dll)
TSCLIB.dll 适用于delphi、vc、vb.net、jsp、java、asp.net、foxpro等,有大量编程案例参考,且有编程说明书、TSCLIB.dll文件、函数调用等,希望对你有帮助
包含了普通类型的参数传递, 结构体传递, 字符串的传入/传出 还有callback等.
自己写的vc/delphi动态库编写和静态调用和动态调用的简单demo, 麻雀虽小五胀俱全.
黄历日期DLL组件 版本:1.0 开发:小焱软件 ... 函数说明: 输出函数原型:...本组件有完整的Delphi,VC和BCB调用例子,VB,.net,java也可以调用,这里就不给出例子了O(∩_∩)O 任何建议欢迎反馈 2009年12月21日
最小需求数和是最小包装数据的计算(MOQ/MPQ函数)VC/DELPHI代码... 里面带VC DLL,DELPHI调用,和DELPHI函数. 两种方式. 算法单,没有优化. 如果有需求可以找我,我会写出优化的算法.msn :shap_it@hotmail.com,QQ: 272762202
本人在开发某系统过程中需要将bmp文件转换为jpg文件,所以开发了这个小程序,用隐藏方式运行它即可悄悄完成转换,可用于vc/delphi等编写的程序中或批处理中,很实用。程序虽小,但支持命令行参数方式调用。 调用格式...
1.自己使用的报表打印控件,使用Delphi的报表FastReport控件(4.9)生成动态库,VC调用打印报表,可进行报表编辑,数据库表单打印。 2.包括Delphi的报表FastReport控件源码,如想自己生成DLL,可用Delphi7安装控件后用...
在Delphi中调用VC++创建的动态链接库,程序中包含创建动态链接库工程和delphi调用工程。