動態鏈結庫的建立(好)

2021-04-25 04:30:22 字數 2538 閱讀 3568

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工具來...