1. 程式人生 > >c++ dll庫的生成和動態載入

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;

}