1.
關於dll
訪問路徑問題
先是查system
下是否有DLL
,然後再查當前工程目錄 或者用VB
調用時直接使用絕對路徑。
2.
關於vb
調用VC DLL
介面問題的闡述
法一:
DLL
匯出函數定義
extern "C" double
_stdcall
GetDistance(LPCSTR
strGPS1,LPCSTR strGPS2)
{
函數體
}
說明
:extern "C"
相容C
語言,_stdcall
用WINAPI
調用規約
適用於VB
其中需要注意的是
關於介面參數字串類型的相容性問題,由於VB
採用的WINAPI
的,所以在VC++
編寫DLL
時,對字元型的參數需要用LPCSTR
定義,否則用VB
調用時會出錯。
接下來編譯 *.def
檔案
LIBRARY
GpsLocating
EXPORTS
GetDistance
主要作用就是:定義需要匯出的函數
Vb
中的調用寫法:
Declare + Function(
如果無傳回值用sub)+ lib +
路徑 +
(參數)as
+
傳回型別。
執行個體:
Private Declare Function GetDistance
Lib "G:/GPS
測距/GPStest(VB)/GpsLocating.dll"(ByVal
strGPS1 As String, ByVal strGPS2 As String) As Double
法二:
採用_declspec(dllexport)
方式,並不是和VB
調用,不作細講。
3.
關於VC++
載入DLL
的問題
簡單做法:只需在link
中填寫*.lib
,然後加入此Dll
的標頭檔,即可
(1).
靜態匯入
#pragma
comment(lib,"*.lib")
extern +
函數;/
或者 _declspec(dllimport) +
函數
(2).
動態匯入
HINSTANCE hDll;
hDll =
LoadLibrary("*.dll"); //
動態載入DLL
typedef
函數類型 (*ADDPROC)(
函數參數)
;
//
定義函數指標類型
ADDPROC Add =
(ADDPROC)GetProcAddress(hDll,"
函數名")
;//
擷取DLL
匯出函數 此時匯出函數就是Add
。
FreeLibrary("*dll"); //
釋放DLL
例子:在dll1.dll
中有add
函數
HINSTANCE hDll;
hDll =
LoadLibrary("Dll1.dll"); //
動態載入DLL
typedef int (*ADDPROC)(int
a,int b)
; //
定義函數指標類型
ADDPROC Add =
(ADDPROC)GetProcAddress(hDll,"add")
;//
擷取DLL
匯出函數 此時匯出函數就是Add
FreeLibrary("Dll1.dll");
//
釋放DLL
兩種匯入方式的對比:
靜態匯入:自動載入dll
,自動釋放DLL
,不過整個工程都會載入這dll
,會找出記憶體浪費
動態匯入:按照 LoadLibrary+GetProcAddress+FreeLibrary
模式動態載入,靈活,有需要時才載入。