VC呼叫Delphi的DLL時遇到的問題及解決

2021-08-24 19:56:02 字數 1586 閱讀 1463

在開發的過程,有時會遇到用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)

else

3) 獲取dll的介面函式,並用指標指向

platetemplatefun = (lpplatetemplatefun)getprocaddress(hdll,"template_data");/

if(null==platetemplatefun)

else

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

1.在vc中新建乙個 dll 工程。寫如 如 extern c int npn int m,int n 編譯生成 dll 檔案。2。在delphi 中申明 function getpplength integer cdecl external dll.dll function npn m integ...

Delphi 呼叫VC生成的DLL

1.在vc中新建乙個 dll 工程。寫如 如 extern c int npn int m,int n 編譯生成 dll 檔案。2。在delphi 中申明 function getpplength integer cdecl external dll.dll function npn m integ...

Delphi呼叫VC編譯的DLL

delphi呼叫vc編譯的dll delphi windows sdk api 嘗試用delphi呼叫vc編譯的dll,dll介面函式中定義一般型別的引數時,可以正常呼叫,但是當在介面函式中定義 函式時,在delphi中將函式指標傳入介面函式時總是報錯,用delphi建立同樣功能的dll,就沒有問題...