c++ dll庫的生成和動態載入
程式中不需要引用lib庫和標頭檔案就可以載入dll,此時需要動態載入,此方法特別常用:
dll庫的生成:
vs新建專案-->dll專案,勾選預編譯頭-->建立,例如專案名稱myDll
成功後會生成dllmain.cpp和stdfx.h,stdfx.cpp,stdfx.h,targetver.h和一個主檔案myDll.cpp,我們把需要匯出的函式都放在myDll.cpp中,這裡不需要標頭檔案;
在myDll.cpp中寫入函式,例如
extern "C" _declspec(dllexport) int add(int a ,int b)
{
return a+b;
}
/*extern "C" _declspec(dllexport) 為修飾符,表示此函式將被匯出;*/
然後點選生成,按需求生成64或32位版本的dll;
dll庫的動態載入:
vs新建專案-->win32專案-->空專案,例如專案名稱為useMyDll
新增main.cpp:
#include <iostream>
#include <windows.h>
typedef int(*Function)(int ,int ) //此處Function代表函式的型別,後面括號代表函式的引數
int main()
{
Function add=NULL:
HINSTANCE hdll=LoadLibrary("myDll.dll"); //此處將myDll.dll放在程式的當前目錄下
if(hdll==NULL) //dll載入失敗
{
std::cout<<GetLastError()<<std::endl;
FreeLibrary(dll); //釋放資源
return 0;
}
//這裡載入dll中的函式,“add”代表所呼叫的dll中的函式名稱
add=(Function)GetProcAddress(hdll, "add");
if(add==NULL) //函式載入失敗,可能函式名寫錯,dll無此函式
{
std::cout<<GetLastError()<<std::endl;
FreeLibrary(dll); //釋放資源
return 0;
}
int result=add(1,1); //呼叫函式
std::cout<<"result:"<<std::endl;
return 0;
}