維尼的蜂巢

RealTime??!! It’s amazing!!!!

dll小小紀錄 十一月 8, 2006

Filed under: VC++/C++/C — kevinlin @ 9:56 上午

要把DLL來做個小紀錄,因為X的勒,周圍沒人會寫,自己找了好久資料,其實說難不難說簡單也不簡單

DLL跟一般AP(Application)有什麼差別呢??
雖然說 DLL 跟AP都是可以執行的程式模組,不過還是有不同的。對user來說,最明顯的差別在 DLL 不是可以直接執行的程式。而從system的觀點來看,AP和 DLL 之間有兩個最基本的差異:

  • AP本身可以同時在系統中執行多個Instance,而 DLL 只能有一個Instance
  • AP可以擁有如堆疊、全域記憶體、File Handle和Message Queue等,而 DLL 裡面沒有這些。

很多時後都不知道為什麼要用DLL,全部放在一起弄成一個exe不就好了??但是DLL還是有它的優點的:

  • 節省記憶體和降低交換。我們可以讓多個AP同時使用同一個 DLL 來共用記憶體裡 DLL 的單一複本。所以反過來說,Windows 必須為每個使用靜態連結程式庫所建置的應用程式,將程式庫碼的複本載入記憶體。
  • 節省磁碟空間。許多應用程式可以共用磁碟上的單一 DLL 複本。相反的,每一個使用靜態連結程式庫建置的應用程式,會將程式庫碼以不同的複本連結至其可執行影像。
  • 升級對於 DLL 而言較為容易。當 DLL 裡的函式變更時,只要函式的引數和傳回值沒有變更,使用這些函式的應用程式就不需要重新編譯或重新連結。相反的,當函式變更時,靜態連結目的碼 (Object Code) 便需要重新連結應用程式。
  • 提供售後支援。例如,顯示卡驅動程式 DLL 可以修改,以便支援應用程式推出時尚無的顯示卡。
  • 支援多重語言程式。只要程式遵循函式的呼叫慣例,以不同程式設計語言撰寫的程式就可以呼叫相同的 DLL 函式。程式和 DLL 函式在下列條件中必須是相容的:函式預期的引數被放入堆疊的順序、函式或應用程式是否負責清除堆疊,以及任何引數是否傳入暫存器。
  • 提供擴充 MFC 程式庫類別的機制。您可以由現有的 MFC 類別衍生類別,並且將它們放在 MFC 擴充 DLL 以便 MFC 應用程式使用。
  • 簡化國際版本的建立。在 DLL 裡放置資源會使建立應用程式的國際版本變得更容易。您可以將應用程式的每種語言版本字串放在不同的資源 DLL,並且讓不同語言版本載入適當的資源。

使用 DLL 可能的缺點是,應用程式不是獨立的 (Self-Contained);它必須依賴不同 DLL 模組的存在。

要把AP連結到DLL上,有兩種方法,(1)隱式連結(2)明確連結
隱含連結有時是當成靜態載入或載入時期動態連結。明確連結有時是當成動態載入或執行階段動態連結。

  • 隱含連結,使用 DLL 的可執行檔便可連結至 DLL 製作者提供的匯入程式庫 (.lib 檔)。作業系統會在可執行檔要使用其載入的 DLL 時,載入 DLL。用戶端可執行檔會像函式是包含在可執行檔內一般,呼叫 DLL 的匯出函式。
  • 明確連結,使用 DLL 的可執行檔必須製作明確載入和卸載 DLL 的函式呼叫 (Function Call),並且存取 DLL 的匯出函式。用戶端可執行檔必須經由函式指標呼叫匯出函式。
  • 可執行檔可以使用具任何一種連結方式的相同 DLL。再者,這些機制之間並不會互相排斥,因此當一個可執行檔隱含地連結至 DLL 時,另一個可執行檔可以明確地連結至它。

所以我現在DLL都用明確連結,其實很容易,只有4個步驟
先假設我game.dll裡有一個 __declspec( dllexport ) void InitHInst( HINSTANCE hInst ) 這樣的function

要呼叫game.dll裡的InitHInst的AP就照下面這樣寫
(1)HMODULE m_Plugin;
(2)m_Plugin = LoadLibrary( “game.dll" );

(3)這一步比較複雜一點

  • typedef void (*PFNInitHINST)(HINSTANCE hInst);
  • PFNInitHINST pfnInitHINST = (PFNInitHINST)GetProcAddress(m_Plugin,?InitHInst@@YAXPAUHINSTANCE__@@@Z);
  • 然後就能這樣使用了pfnInitHINST(hInst);

(4)FreeLibrary(m_Plugin);
第二步連結到某dll中,第三步取出的函式就可以拿來使用了,最後要釋放掉該dll比較好

ps.從MSDN整理過來的

 

2 Responses to “dll小小紀錄”

  1. 阿鋒 Says:

    維尼走火入魔…..進入了0的領域….

  2. kevin Says:

    阿鋒進入gay的領域了


發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s