C++生成dll和調用dll的方法實例

建立兩個文件 xxx.h , xxx.cpp

xxx.h內容如下:

#ifdef BUILD_XXX_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

extern "C"{
EXPORT void example(void);
... ...
}

xxx.cpp內容如下:

#define BUILD_XXX_DLL
#include "xxx.h"

void example(void)
{
}
... ...

然後從DOS控制檯進行編譯(假設已經安裝mingw並加入環境變量)
g++ -shared -Wl,--kill-at,--output-def,xxx.def -o xxx.dll xxx.cpp

(因爲C++通過修飾函數名來實現函數重載,所以我們要用extern "C"配合--kill-at編譯選項來避免對函數名的修正,BUILD_XXX_DLL宏的作用是用來選擇函數原型聲明的作用)

2)靜態調用dll

在新文件yyy.cpp里加入如下內容;
#include "xxx.h"
#pragma comment(lib,"xxx.dll")

生成的dll不需要def文件和cpp文件也可以
不包含xxx.h的話,需要把h文件內的函數原型聲明添加進yyy.cpp

編譯時需要加入dll,類似這樣:
g++ -L. -o yyy.exe yyy.cpp xxx.dll

3)動態調用dll

首先,你需要包含windows.h
#include <windows.h>

你還需要一個句柄保存裝入的dll文件
HINSTANCE hDll=LoadLibrary("xxx.dll");

聲明所需函數的對應函數指針類型
typedef void (*pfunc)(void);

獲得指向函數的函數指針
pfunc pf=(pfunc*)GetProcAddress(hDll,"example");

使用完畢後,要釋放dll文件
FreeLibrary(hDll);


1)生成dll

建立兩個文件 xxx.h , xxx.cpp

xxx.h內容如下:

#ifdef BUILD_XXX_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

extern "C"{
EXPORT void example(void);
... ...
}

xxx.cpp內容如下:

#define BUILD_XXX_DLL
#include "xxx.h"

void example(void)
{
}
... ...

然後從DOS控制檯進行編譯(假設已經安裝mingw並加入環境變量)
g++ -shared -Wl,--kill-at,--output-def,xxx.def -o xxx.dll xxx.cpp

(因爲C++通過修飾函數名來實現函數重載,所以我們要用extern "C"配合--kill-at編譯選項來避免對函數名的修正,BUILD_XXX_DLL宏的作用是用來選擇函數原型聲明的作用)

2)靜態調用dll

在新文件yyy.cpp里加入如下內容;
#include "xxx.h"
#pragma comment(lib,"xxx.dll")

生成的dll不需要def文件和cpp文件也可以
不包含xxx.h的話,需要把h文件內的函數原型聲明添加進yyy.cpp

編譯時需要加入dll,類似這樣:
g++ -L. -o yyy.exe yyy.cpp xxx.dll

3)動態調用dll

首先,你需要包含windows.h
#include <windows.h>

你還需要一個句柄保存裝入的dll文件
HINSTANCE hDll=LoadLibrary("xxx.dll");

聲明所需函數的對應函數指針類型
typedef void (*pfunc)(void);

獲得指向函數的函數指針
pfunc pf=(pfunc*)GetProcAddress(hDll,"example");

使用完畢後,要釋放dll文件
FreeLibrary(hDll);

建立兩個文件 xxx.h , xxx.cpp

xxx.h內容如下:

#ifdef BUILD_XXX_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

extern "C"{
EXPORT void example(void);
... ...
}

xxx.cpp內容如下:

#define BUILD_XXX_DLL
#include "xxx.h"

void example(void)
{
}
... ...

然後從DOS控制檯進行編譯(假設已經安裝mingw並加入環境變量)
g++ -shared -Wl,--kill-at,--output-def,xxx.def -o xxx.dll xxx.cpp

(因爲C++通過修飾函數名來實現函數重載,所以我們要用extern "C"配合--kill-at編譯選項來避免對函數名的修正,BUILD_XXX_DLL宏的作用是用來選擇函數原型聲明的作用)

2)靜態調用dll

在新文件yyy.cpp里加入如下內容;
#include "xxx.h"
#pragma comment(lib,"xxx.dll")

生成的dll不需要def文件和cpp文件也可以
不包含xxx.h的話,需要把h文件內的函數原型聲明添加進yyy.cpp

編譯時需要加入dll,類似這樣:
g++ -L. -o yyy.exe yyy.cpp xxx.dll

3)動態調用dll

首先,你需要包含windows.h
#include <windows.h>

你還需要一個句柄保存裝入的dll文件
HINSTANCE hDll=LoadLibrary("xxx.dll");

聲明所需函數的對應函數指針類型
typedef void (*pfunc)(void);

獲得指向函數的函數指針
pfunc pf=(pfunc*)GetProcAddress(hDll,"example");

使用完畢後,要釋放dll文件
FreeLibrary(hDll);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章