工程簡單重構,封裝動態鏈結庫

2021-06-21 21:54:53 字數 3346 閱讀 3742

廢話不多說,首先新建專案

在這裡我們選擇mfc dll,名稱我們取skinui,確定後,選擇mfc擴充套件dll,好,到這裡乙個mfc的動態鏈結庫就完成了。

先看一下我們的工程目錄結構

doc目錄:說明文件

lib目錄:生成的lib庫

skinui目錄:目前的介面庫工程

skinui_scrollbar目錄:滾動條工程

control目錄:測試工程

detours目錄:第三方鉤子工程

關於detours的編譯過程,doc資料夾有怎麼編譯的文件,如果還是不過,用vs新建乙個鏈結庫工程,把裡面的所有檔案載入進去編譯一下就行了

繼續說skinui動態鏈結庫的製作過程,之前我們把骨架搭起來了,現在我們把之前寫的東西弄進來,

到這裡,動態鏈結庫並沒有完成,其實,現在才要開始製作動態鏈結庫

先建乙個標頭檔案,命名skinui.h,**如下

#ifndef skinui_head_file

#define skinui_head_file

//

//系統標頭檔案

#include #include #include #include #include using namespace gdiplus;

using namespace std;

//

//匯出定義

#ifndef skinui_class

#ifdef skinui_dll

#define skinui_class _declspec(dllexport)

#else

#define skinui_class _declspec(dllimport)

#endif

#endif

//模組定義

#ifdef _debug

#define skinui_dll_name text("skinuid.dll") //元件 dll 名字

#else

#define skinui_dll_name text("skinui.dll") //元件 dll 名字

#endif

//#define on_rbn_dblclk(id, memberfxn) \

on_control(bn_clicked, id, memberfxn)

////listbox item

struct tagitemstruct

;

//匯出類標頭檔案

////平台標頭檔案

#include "macro.h"

#include "function.h"

#include "memorydc.h"

#include "imageex.h"

#include "rendermanager.h"

#include "iskincontrol.h"

#ifndef skinui_dll

#include "skinbutton.h"

#include "skincombobox.h"

#include "skindialog.h"

#include "skinedit.h"

#include "skinlistbox.h"

#endif

//

#endif

上面**主要說一下的是匯出定義部分,dll一般情況下都有_declspec(dllexport)和_declspec(dllimport),分別表示匯出和匯入,dll不像是exe那樣,dll是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。說到這裡,這個匯出和匯入就好像**裡面的出口和進口一樣。

下面的模組定義,都知道定義了乙個字串的巨集,用處也很明顯,在dll中不能使用afxgetinstancehandle函式來獲取當前的例項控制代碼,而是通過getmodulehandle獲取,這裡我們也為了方便採用巨集代替字串,方便管理和維護

到這裡,我們只完成了一辦,現在我們要為每乙個需要匯出的檔案新增匯出標識,比如cimageex類

#ifndef image_head_file

#define image_head_file

#pragma once

#include "skinui.h"

////物件

class skinui_class cimageex

這樣一來,cimageex就被定義成匯出類,其他的外部程式就可以引用這個類了,其他匯出類,依次執行此操作

最後,我們開啟stdafx.h,新增標頭檔案和庫檔案

//mfc 檔案

#include #include #include #include //其他檔案

#include "../skinui_scrollbar/detours.h"

#include "../skinui_scrollbar/skinui_scrollbar.h"

//庫檔案

#ifdef _debug

#pragma comment (lib,"../lib/skinui_scrollbard.lib")

#else

#pragma comment (lib,"../lib/skinui_scrollbar.lib")

#endif

#pragma comment (lib,"../lib/detours.lib")

#pragma comment(lib,"gdiplus.lib")

再開啟dllmain.cpp,將之前control工程的control.cpp的滾動條鉤子**和gdi+的初始化**全部挪過來,現在,我們的動態鏈結庫就完成了。

在文章結束前,我們把之前寫的control工程全部挪過來,把關於skinui的**檔案全部刪掉,然後開啟stdafx.h檔案,修改一下**

#include "../skinui/skinui.h"

//庫檔案

#ifdef _debug

#pragma comment (lib,"../lib/skinuid.lib")

#else

#pragma comment (lib,"../lib/skinui.lib")

#endif

將之前引用那些檔案**換成這個,例子工程也就完成了

本次只是為了滿足部分朋友的需要,控制項篇結束後,我們在稍稍的重構完善一下,讓他近似乙個介面庫

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...