常在江湖飄,少不了要和DLL打交道。有時我們需要使用C++Builder編寫一個DLL,然後拿到VC中用(比如用C++Builder寫一個表單封裝到DLL);有時又要拿VC編寫的DLL在C++Builder使用(比如拿到一個產品的開發包,這個包是一堆用VC寫的DLL)。
很遺憾,由於MS和Borland(CodeGear)兩家的編輯器實現細節不同,造成了它們產生的DLL不能相互連用,因此給實際帶來了很多的麻煩。下面來說一說如何解決這個問題。
一、VC產生DLL,C++Builder調用。
1、用extern "C"修飾VC匯出的DLL函數。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的implib工具產生DLL對應的lib檔案。如:implib -a xxx.lib xxx.dll(注意,implib一定要帶-a開關)。產生lib檔案之後,C++Builder便可以使用這個lib檔案了。
二、C++Builder產生DLL,VC調用。
1、用extern "C"修飾C++Builder匯出的DLL函數。如:extern "C" __declspec(dllexport) int aFunc(int a);
2、用C++Builder的impdef工具產生DLL對應的def檔案。如:impdef xxx.def xxx.dll。
3、用記事本開啟xxx.def檔案,刪去每個函數名前的"_"。如原來的def檔案為:
-
C/C++ code
-
LIBRARY XXX.DLLEXPORTS ___CPPdebugHook @2 ; ___CPPdebugHook _aFunc @1 ; _aFunc
那麼刪除後就變成了:
-
C/C++ code
-
LIBRARY XXX.DLLEXPORTS __CPPdebugHook @2 ; ___CPPdebugHook aFunc @1 ; _aFunc
4、用VC的LIB工具,根據上面的def檔案產生lib檔案。如:LIB /DEF:XXX.def。產生lib檔案之後,VC便可以使用這個lib檔案了。
綜上說來,兩種工具開發的DLL在相互使用的時候,主要的問題便是lib庫的問題,能把這一問題解決好行了。