vc 關於動態庫的哪些知識

2021-06-20 12:03:49 字數 2111 閱讀 2428

專案開發都是分模組的,所以常常需要些個動態庫方便別人呼叫。這兩天因為專案整合,因為是組長負責整合我只需要跟進就可以,模組有問題需要及時調整的。所以上班的時候有零碎的時間。就看看公司的一些**,然後有感而發,就把動多型庫的知識看了一下。下面是一些心得(都是從乙個文章摘抄的一些東西,pdf我會上傳的):

1.,靜態呼叫方式的順利進行需要完成兩個動作

(1)告訴編譯器與 dll 相對應的.lib 檔案所在的路徑及檔名,#pragmacomment(lib,"dlltest.lib")就是起這個作用。

程式設計師在建立乙個 dll 檔案時,聯結器會自動為其生成乙個對應的.lib 檔案,

該檔案包含了 dll 匯出函式的符號名及序號(並不含有實際的**)。在應用程式裡,.lib 檔案將作為 dll 的替代檔案參與編譯。

2)宣告匯入函式,extern "c" __declspec(dllimport) add(int x,inty)語句中的__declspec(dllimport)發揮這個作用。

2.dllmain函式

2.1.windows 在載入 dll 的時候,需要乙個入口函式;dll 如沒

有提供 dllmain 函式,應用工程也能成功引用 dll,這是因為 windows 在找不到

dllmain 的時候,系統會從其它執行庫中引入乙個不做任何操作的預設 dllmain

函式版本

2.2 windows 必須查詢並執行 dll 裡的 dllmain 函式作為載入

dll 的依據,它使得 dll 得以保留在記憶體裡。這個函式並不屬於匯出函式,而是

dll 的內部函式。這意味著不能直接在應用工程中引用 dllmain 函式,dllmain

是自動被呼叫的。

3.mfc dll使用:

3.1 regular dll 分為兩類

(1)靜態鏈結到 mfc 的規則 dll

靜態鏈結到 mfc 的規則 dll 與 mfc 庫(包括 mfc 擴充套件 dll)靜態鏈結,將

mfc 庫的**直接生成在.dll 檔案中。在呼叫這種 dll 的介面時,mfc 使用 dll

的資源。因此,在靜態鏈結到 mfc 的規則 dll 中不需要進行模組狀態的切換。

使用這種方法生成的規則 dll 其程式較大,也可能包含重複的**。

(2)動態鏈結到 mfc 的規則 dll

動態鏈結到 mfc 的規則 dll 可以和使用它的可執行檔案同時動態鏈結到

mfc dll 和任何 mfc 擴充套件 dll。在使用了 mfc 共享庫的時候,預設情況下,mfc

使用主應用程式的資源控制代碼來載入資源模板。這樣,當 dll 和應用程式中存在相

同 id 的資源時(即所謂的資源重複問題),系統可能不能獲得正確的資源。因

此,對於共享 mfc dll 的規則 dll,我們必須進行模組切換以使得 mfc 能夠找到

正確的資源模板。

3.2 共享 mfc dll 的規則 dll 的模組切換

(1)應用程式程序本身及其呼叫的每個 dll 模組都具有乙個全域性唯一的

hinstance 控制代碼,它們代表了 dll 或 exe 模組在程序虛擬空間中的起始位址。進

程本身的模組控制代碼一般為 0x400000,而 dll 模組的預設控制代碼為 0x10000000

(2)共享 mfc dll(或 mfc 擴充套件 dll)的規則 dll 涉及到 hinstance 控制代碼問題,

hinstance 控制代碼對於載入資源特別重要。exe 和 dll 都有其自己的資源,而且這

些資源的 id 可能重複,應用程式需要通過資源模組的切換來找到正確的資源

(3)資源模組控制代碼的切換,其實現方法有三:

方法一在 dll 介面函式中使用:

afx_manage_state(afxgetstaticmodulestate());

方法二在 dll 介面函式中使用:

afxgetresourcehandle 用於獲取當前資源模組控制代碼,而

afxsetresourcehandle 則用於設定程式目前要使用的資源模組控制代碼。

方法三 由應用程式自身切換

資源模組的切換除了可以由 dll 介面函式完成以外,由應用程式自身也能

完成文章所有的東西都是來自《vc++動態鏈結庫(dll)》,我希望看到這個帖子的人如果有需要的話可以看看這個數,比較詳細,文章也不長。

關於VC 動態鏈結庫的相關知識

1 匯入dll 1 靜態匯入 pragma comment lib,lib extern 函式 或者 declspec dllimport 函式 2 動態匯入 hinstance hdll hdll loadlibrary dll 動態載入dll typedef 函式型別 addproc 函式引數 ...

linux 關於動態庫的知識

問題起緣於編譯乙個程式時,使用glib2 2.28.8的動態庫,而系統自帶的是glib2 2.22.5 不想公升級系統的glib2庫,而使用程式自帶庫檔案的方式載入 類似windows系統,優先載入當前目錄的dll檔案 1.首先編譯時,使用 l指定lib路徑,lglib 2.0指定庫檔名 2.執行時...

VC 呼叫C 動態庫

近期專案中,需要訪問客戶資料庫,客戶不希望直接訪問其資料庫,而是以動態庫介面的形式開放,還是用c 開發的。經過不斷嘗試,總結方法如下 包含動態庫 using test.dll using namespace test lib using namespace runtime interopservic...