1.lib庫我們稱之爲靜態庫,在編譯的時候調用,而dll庫早使用的時候地時候調用。
如果你希望自己寫的庫既能給c語言用,又能給c++語言用。就需要寫一個宏,如下所示,這個宏表不管是C++工程調用還是C工程調用,都以C的方式調用
#ifdef __cplusplus
extern "C"
{
#endif
int ADD(int a,int b);
#ifdef __cplusplus
}
#endif
6.庫函數返回的數據類型
3.2 顯示加載方式加載dll
另一種是通過LoadLiabrary函數顯示加載dll。代碼如下。需要注意的是這時候我們不再需要註冊.lib文件,也不需要聲明外部函數。只要在需要使用的地方調用dll文件即可。
void CXXXDlg::OnBtnSubtract()
{
// TODO: Add your control notification handler code here
HINSTANCE hInst;
hInst = LoadLibrary(L"Dll1.dll");
typedef int(*SUBPROC)(int a, int b);
SUBPROC Sub = (SUBPROC)GetProcAddress(hInst, "subtract");
CString str;
str.Format(_T("5-3=%d"), Sub(5, 3));
FreeLibrary(hInst); //LoadLibrary後要記得FreeLibrary
MessageBox(str);
}
動態庫加載出現的問題:
方案1:
usb.h文件:
#ifndef USBDLL_H
#define USBDLL_H
//
//
//條件編譯指令
#ifndef _ADDAPI
#define ADDAPI _declspec(dllexport)
#else
#define ADDAPI _declspec(dllimport)
#endif
//
//聲明導出函數
//__declspec(dllexport)
extern "C" int ADDAPI getUSbDev();///導出函數
extern "C" int ADDAPI sendUSbmessage();////extern "C" 改爲C語言的調用方法,cpp文件函數就不會被改名
#endif
usb.cpp文件:
typedef int (*PADD)(int a,int b);
typedef int (*SUB)(int a,int b);
///注意C++語法會改變動態庫函數的名字,必須將函數的名字從usbdll.cpp改爲usbdll.c
int main()
{
HMODULE hdll=LoadLibrary(L"../Debug/testdll.dll");
if (hdll==NULL)
{
printf("動態可加載失敗 ")
}
PADD pAdd=(PADD)GetProcAddress(hdll,"add");
SUB pSUb =(SUB)GetProcAddress(hdll,"sub");
//////pAdd就是add,pSUb就是sub函數
FreeLibrary(hdll);///動態加載的好處就是可以自動釋放
}
方案2:
#pragma comment(lib,"hid.lib");////隱式調用動態庫,不存在函數名亂碼問題
方案3:
創建模塊定義文件(def文件)。將函數名字依次每列寫進去。動態庫函數名字就不會被改