1. 需要在要匯出的函式前加上關鍵字 _declspec(dllexport) 例如:
_declspec(dllexport) int add(int a,int b)
class _declspec(dllexport) classname //將_declspec(dllexport)放在類名前,將匯出類的所有成 ;
//以上方式匯出時編譯器將自動將函式名改編以支援函式過載,這樣匯出的dll在c程式無法使用,
//為了解決這個問題必須再加上 extern "c" 關鍵字,以使匯出時不變更函式名。例如:
extern "c" _declspec(dllexport) int add(int a,int b)
//如果增加函式呼叫約定的關鍵字 _stdcall,則不論是否宣告過 extern "c" 都將進行函式名改編。
//例如:
extern "c" _declspec(dllexport) _stdcall int add(int a,int b)
//使用模組定義檔案匯出函式時不需要關鍵字 _declspec(dllexport),函式名也可以自行定義,
library dll1 //dll1是動態鏈結庫的內部名,必須與匯出的dll檔名相同
exports //匯出標記
add //匯出的函式名
sub=subtract //匯出後的函式名=被匯出的函式名
2. 編譯後會生成*.lib 和*.dll 檔案。
其中*.lib 檔案為匯出庫檔案,他包含了動態鏈結庫中的函式名和變數名等資訊;*.dll檔案為動態鏈結庫檔案,他包含了函式的實現和變數等資料。
extern int add(int ,int); //第一種方式
或者:
_declspec(dllimport) int add(int ,int); //第二種方式(推薦)
class _declspec(dllimport) classname
; //推薦使用第2種方式,因為他可以告訴編譯器該函式來自乙個dll,據說可以生成效率更高的**。
2. 在工程中新增建立時產生的*.lib。
hinstance hinst;
hinst=loadlibrary("dll1.dll"); //api函式載入dll
typedef int (*addproc)(int a,int b); //定義函式指標型別
addproc add=(addproc)getprocaddress(hinst,"add"); //api函式獲取函式位址
/*addproc add=(addproc)getprocaddress(hinst,makeintresource(1));
*使用函式序號的方式獲取函式位址*/
if(!add)
add(5,3);
freelibrary(hinst); //api函式釋放dll
//動態載入時不需要在工程中新增*.lib,並且使用dumpbin工具也無法看到需要的外部函式名
動態鏈結庫的入口函式
bool winapi dllmain(
hinstance hinstdll, // handle to the dll module
dword fdwreason, // reason for calling function
lpvoid lpvreserved // reserved
); 小技巧:
1. 可以使用dumpbin或者depends工具來檢視dll匯出的函式,也可以用他來查exe檔案需要的外部函式。
2. 在編譯dll檔案時,通常提供乙個標頭檔案,例如:
#ifdef dll1_api
#else
#define dll1_api _declspec(dllimport)
#endif
dll1_api int add(int a,int b);
這樣在建立dll檔案時做如下修改:
#define dll1_api _declspec(dllexport)
#include "dll1.h"
int add(int a,int b) //此處不再需要_declspec(dllexport),因為已經在標頭檔案中宣告過了。
在使用dll檔案時做如下修改:
#include "dll1.h" //新增標頭檔案
int add(int ,int); //此處不再需要_declspec(dllimport),因為已經在標頭檔案中宣告過了。
建立靜態鏈結庫 動態鏈結庫
下面的實操中的動態庫或者靜態庫名都用wujunwu 第一步 建立乙個源 建立靜態鏈結庫的源 include void func1 void int func2 int x,int y 第二步 建立乙個.件作為函式宣告 void func1 void intfunc2 int x,int y 第三步 ...
建立動態鏈結庫
要建立dll,就必須首先建立乙個或多個源 檔案,還有乙個連線檔案用來匯出函式。如果打算可以以載入時動態鏈結使用dll的話,還必須建立乙個導入庫。建立原始檔 dll的源 中包含了需匯出的函式及資料,還有內部函式及資料,另外可以有乙個可選的入口函式。你可以使用任意支援建立基於windows的dll工具來...
建立動態鏈結庫
要建立dll,就必須首先建立乙個或多個源 檔案,還有乙個連線檔案用來匯出函式。如果打算可以以載入時動態鏈結使用dll的話,還必須建立乙個導入庫。建立原始檔 dll的源 中包含了需匯出的函式及資料,還有內部函式及資料,另外可以有乙個可選的入口函式。你可以使用任意支援建立基於windows的dll工具來...