在開發的過程,有時會遇到用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,就沒有問題...