在开发的过程,有时会遇到用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之间数组的不通用上了。

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

      本人水平有限,望见谅!