廢話不多說,首先新建專案
在這裡我們選擇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...