Dll動態鏈結庫建立與隱式鏈結方式使用

2021-08-18 07:50:59 字數 3452 閱讀 4484

windows作業系統誕生以來,dll就作為win作業系統的基礎,通常情況下dll不能直接執行,也無法接收訊息,只能供其他可執行程式或者dll來呼叫,完成某項功能,他的函式只有被呼叫才會發揮作用,windows中有三個重要的dll,他們分別是kernal32.dll,user32.dll,gdi32.dll。

作用:

隱藏實現細節,再提供給三方客戶端使用,便於保護私密資訊。

提供二次開發等。

建立方式:

1、巨集定義的方式宣告方法名

2、使用模組定義檔案定義匯出函式的方式

檢視:

visual studio安裝之後,會自帶「vs 2017開發人員命令提示符」終端,裡面可以直接執行dumpbin命令。另一種辦法是進入visual studio安裝

目錄下的乙個

工具目錄,如我的安裝在:d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.13.26128\bin

\hostx64\x64。進入

該目錄,就可以使用dumpbin命令了。

方法名問題:

預設如果不做任何處理,生成的動態鏈結庫可以匯出函式,但是函式名會出現特殊字元。並不是我們在原始檔中定義的方法名,因此需要對函式宣告做一些處理。還有一種方法就是通過模組定義檔案的方式生成dll,這樣方法名就不存在改變的問題了。

使用方式:

隱式鏈結和動態載入

介紹第一種方式建立動態鏈結庫並使用隱式鏈結的方式使用dll。

1、建立dll工程。

2、編寫標頭檔案。

#ifdef dll_api1

#else

#define dll_api1 extern "c" _declspec(dllimport)

#endif

dll_api1 int add(int a, int b);

dll_api1 int substract(int a, int b);

3、編寫原始檔。

#include "stdafx.h"

#define dll_api1 extern "c"  _declspec(dllexport)

#include "dll2.h"

int add(int a, int b)

int substract(int a, int b)

4、生成。右鍵專案名->生成。我這裡設定活動解決方案配置的是release,活動解決方案平台採用的是x64。

1>------ 已啟動生成: 專案: dll2, 配置: release x64 ------

1>stdafx.cpp

1>dll2.cpp

1>dllmain.cpp

1>  正在建立庫 d:\feiy\workspace\vs\tutorials3\x64\release\dll2.lib 和物件 d:\feiy\workspace\vs\tutorials3\x64\release\dll2.exp

1>正在生成**

1>all 3 functions were compiled because no usable ipdb/iobj from previous compilation was found.

1>已完成**的生成

1>dll2.vcxproj -> d:\feiy\workspace\vs\tutorials3\x64\release\dll2.dll

********** 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 **********

5、通過dumpbin檢視生成的dll。dumpbin是visual studio提供的乙個可以檢視動態鏈結庫匯入匯出資訊。這裡不做詳細介紹。

啟動->所有程式->visual sdudio 2017->visual studio tools->vs 2017的開發人員命令提示符,輸入dumpbin -export path/to/***.dll

d:\program files (x86)\microsoft visual studio\2017\community>dumpbin -exports d

:\feiy\workspace\vs\tutorials3\x64\release\dll2.dll

microsoft (r) coff/pe dumper version 14.13.26129.0

dump of file d:\feiy\workspace\vs\tutorials3\x64\release\dll2.dll

file type: dll

section contains the following exports for dll2.dll

00000000 characteristics

ffffffff time date stamp

0.00 version

1 ordinal base

2 number of functions

2 number of names

ordinal hint rva      name

1    0 00001000 add = add

2    1 00001010 substract = substract

summary

1000 .data

1000 .pdata

1000 .rdata

1000 .reloc

1000 .rsrc

1000 .text

從輸出內容看,dll匯出了我們定義的兩個函式add,substract,驗證了動態鏈結庫建立成功。接下來就是通過程式來呼叫動態鏈結庫了。

7、新建console工程,加入dll,lib檔案到專案中。

這裡需要將dll2.dll,dll2.lib檔案都拷貝到專案路徑下。還需要在資源檔案上執行右鍵->新增->現有項,找到dll2.lib檔案匯入。

8、編寫測試原始檔,並執行。我這裡是在乙個解決方案下的多個專案,所以沒有直接將標頭檔案dll2.h放入當前專案中,而是直接根據路徑引入dll2專案下的dll2.h標頭檔案。

#include #include "../dll2/dll2.h"

using namespace std;

int main()

執行結果:

隱式鏈結無 LIB動態鏈結庫

由於我們經常要呼叫一些第三方廠商或其他編譯器編寫的動態鏈結庫,但是一般都不提供原始檔或.lib檔案,而作為vc隱式鏈結到dll implicitly link to the dll 呼叫,這些卻是必需的。本文將主要討論在沒有原始檔及.lib輸入庫檔案或欲呼叫windows未公開函式的情況下重建.li...

建立C 動態鏈結庫 dll

先來一段vc 給我們提供的標準模板 ifdef connection exports define connection api declspec dllexport else define connection api declspec dllimport endif 此類是從 connectio...

動態鏈結庫DLL

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 靜態庫 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在多個同樣的程式執行時,系統保留了許多重複的 副本,造成記憶體資源浪費。動態庫 使用...