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之間數組的不通用上了。

      我們解決這個問題正好用了一周,相信還有許多朋友遇到了類似的問題,希望本文能給您提供幫助,也好不白費我的一片苦心。

      本人水平有限,望見諒!

 

 

 

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com