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之间数组的不通用上了。

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

      本人水平有限,望见谅!

 

 

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值