網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > 綜合知識 > 

dll檔案怎麼寫

欄目: 綜合知識 / 發佈於: / 人氣:9.76K
1. dll是什麼檔案格式

DLL的全稱是Dynamic Link Library, 中文叫做“動態連結檔案”。

dll檔案怎麼寫

在Windows操作系統中, DLL對於程序執行是非常重要的, 因爲程序在執行的時候, 必須連結到DLL檔案, 才能夠正確地執行。

而有些DLL檔案可以被許多程序共用。因此, 程序設計人員可以利用DLL檔案, 使程序不至於太過巨大。

擴展資料

DLL是動態連接庫。使用動態連接庫的一些好處是:

1.多個應用程序共享代碼和數據:比如Office軟件的各個組成部分有相似的外觀和功能,這就是透過共享動態連接庫實現的。

2.在鉤子程序過濾系統消息時必須使用動態連接庫。

3.動態連接庫以一種自然的方式將一個大的應用程序劃分爲幾個小的模組,有利於小組內部成員的分工與合作。而且,各個模組可以獨立升級。如果小組中的一個成員開發了一組實用例程,他就可以把這些例程放在一個動態連接庫中,讓小組的其他成員使用。

參考資料來源:百度百科-動態連結庫檔案

2. dll檔案用什麼語言寫或者怎麼製作

DLL(Dynamic Link Library)檔案爲動態連結庫檔案,又稱“應用程序拓展”,是軟件檔案類型。在Windows中,許多應用程序並不是一個完整的可執行檔案,它們被分割成一些相對獨立的動態連結庫,即DLL檔案,放置於系統中。當我們執行某一個程序時,相應的DLL檔案就會被調用。一個應用程序可使用多個DLL檔案,一個DLL檔案也可能被不同的應用程序使用,這樣的DLL檔案被稱爲共享DLL檔案。

Windows操作系統中的一些作爲 DLL 實現的檔案

·ActiveX 控件 (.ocx) 檔案

ActiveX控件的一個示例是日曆控件,它使您可以從日曆中選擇日期。

·控制面板 (.cpl) 檔案

.cpl 檔案的一個示例是位於控制面板中的項。每個項都是一個專用 DLL。

·設備驅動程序(.drv) 檔案

設備驅動程序的一個示例是控制打印到打印機的打印機驅動程序。

連結方法:

當您在應用程序中加載 DLL 時,可以使用兩種連結方法來調用匯出的 DLL 函數。這兩種連結方法是加載時動態連結和執行時動態連結。

在執行時動態連結中,應用程序調用 LoadLibrary 函數或 LoadLibraryEx 函數以在執行時加載 DLL。成功加載 DLL 後,可以使用 GetProcAddress 函數獲得要調用的匯出的 DLL 函數的地址。在使用執行時動態連結時,無需使用匯入庫檔案。

Win32 DLL的特點

Win32 DLL與 Win16 DLL有很大的區別,這主要是由操作系統的設計思想決定的。一方面,在Win16 DLL中程序入口點函數和出口點函數(LibMain和WEP)是分別實現的;而在Win32 DLL中卻由同一函數DLLMain來實現。無論何時,當一個進程或線程載入和卸載DLL時,都要調用該函數,它的原型是

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);

其中,第一個參數表示DLL的實例句柄;第三個參數系統保留;這裏主要介紹一下第二個參數,它有四個可能的值:DLL_PROCESS_ATTACH(進程載入),DLL_THREAD_ATTACH(線程載入),DLL_THREAD_DETACH(線程卸載),DLL_PROCESS_DETACH(進程卸載),在DLLMain函數中可以對傳遞進來的這個參數的值進行判別,並根據不同的參數值對DLL進行必要的初始化或清理工作。舉個例子來說,當有一個進程載入一個DLL時,系統分派給DLL的第二個參數爲DLL_PROCESS_ATTACH,這時,你可以根據這個參數初始化特定的數據。另一方面,在Win16環境下,所有應用程序都在同一地址空間;而在Win32環境下,所有應用程序都有自己的私有空間,每個進程的空間都是相互獨立的,這減少了應用程序間的相互影響,但同時也增加了編程的難度。大家知道,在Win16環境中,DLL的全局數據對每個載入它的進程來說都是相同的;而在Win32環境中,情況卻發生了變化,當進程在載入DLL時,系統自動把DLL地址映射到該進程的私有空間,而且也複製該DLL的全局數據的一份拷貝到該進程空間,也就是說每個進程所擁有的相同的DLL的全局數據其值卻並不一定是相同的。因此,在Win32環境下要想在多個進程中共享數據,就必須進行必要的設定。亦即把這些需要共享的數據分離出來,放置在一個獨立的數據段裏,並把該段的屬性設定爲共享。

3. 我想寫一個dll檔案,供大家用

因爲我用的是Visual Studio 英文版,所以有些選單或選項的名稱也許會不一樣

1. 新增項目時新增一個Windows Library(Windows 類庫)

2. 在裏面新增一些接口或類

這樣編譯好後就會產生一個dll,其它的.net項目就可以引用這個dll

另外,你也可以將一個Windows應用程序的項目變成類庫

例如我已經有一個Windows應用程序的項目,在vs .net中選中該項目,按鼠標右鍵,點擊屬性,開啟項目的屬性畫面

在屬性畫面的第一個頁籤就是“應用程序”,那個頁籤裏有一個選項叫“輸出類型”,你把輸出類型設爲“類庫”,這樣在編譯的時候就會產生一個dll,其它.net 項目就可以引用這個dll了

4. DLL檔案是幹什麼用的

DLL檔案即動態連結庫檔案,是一種可執行檔案,它允許程序共享執行特殊任務所必需的代碼和其他資源。Windows提供的DLL檔案中包含了允許基於Windows的程序在Windows環境下操作的許多函數和資源。

DLL多數情況下是帶有DLL副檔名的檔案,但也可能是EXE或其他副檔名。它們向執行於Windows操作系統下的程序提供代碼、數據或函數。程序可根據DLL檔案中的指令開啟、啓用、查詢、禁用和關閉驅動程序。

DLL的全稱是Dynamic Link Library, 中文叫做“動態連結檔案”。在Windows操作系統中, DLL對於程序執行是非常重要的, 因爲程序在執行的時候, 必須連結到DLL檔案, 才能夠正確地執行。而有些DLL檔案可以被許多程序共用。因此, 程序設計人員可以利用DLL檔案, 使程序不至於太過巨大。但是當安裝的程序越來越多, DLL檔案也就會越來越多, 如果當你刪除程序的時候, 沒有用的DLL檔案沒有被刪除的話, 久而久之就造成系統的負擔了。

DLL是動態連接庫。使用動態連接庫的一些好處是:

1.多個應用程序共享代碼和數據:比如Office軟件的各個組成部分有相似的外觀和功能,這就是透過共享動態連接庫實現的。

2.在鉤子程序過濾系統消息時必須使用動態連接庫。

3.動態連接庫以一種自然的方式將一個大的應用程序劃分爲幾個小的模組,有利於小組內部成員的分工與合作。而且,各個模組可以獨立升級。如果小組中的一個成員開發了一組實用例程,他就可以把這些例程放在一個動態連接庫中,讓小組的其他成員使用。

4.爲了實現應用程序的國際化,往往需要使用動態連接庫。使用動態連接庫可以將針對某一國家、語言的資訊存放在其中。對於不同的版本,使用不同的動態連接庫。在使用AppWizard生成應用程序時,我們可以指定資源檔案使用的語言,這就是透過提供不同的動態連接庫實現的。

VC++、C++ Builder、Delphi都可以編寫DLL檔案。Visual Basic 5.0以上版本也可以編寫一種特殊的DLL,即ActiveX DLL。

DLL不是獨立執行的程序,它是某個程序的一個部分,它只能由所屬的程序調用。用戶不能,也不需要開啟它。

5. dll檔案格式怎麼開啟

DLL檔案(Dynamic Linkable Library 即動態連結庫檔案),是一種不能單獨執行的檔案,它允許程序共享執行特殊任務所必需的代碼和其他資源 比較大的應用程序都由很多模組組成,這些模組分別完成相對獨立的功能,它們彼此協作來完成整個軟件系統的工作。

可能存在一些模組的功能較爲通用,在構造其它軟件系統時仍會被使用。在構造軟件系統時,如果將所有模組的原始碼都靜態編譯到整個應用程序 EXE 檔案中,會產生一些問題:一個缺點是增加了應用程序的大小,它會佔用更多的磁盤空間,程序執行時也會消耗較大的內存空間,造成系統資源的浪費;另一個缺點是,在編寫大的 EXE 程序時,在每次修改重建時都必須調整編譯所有原始碼,增加了編譯過程的複雜性,也不利於階段性的單元測試。

Windows 系統平臺上提供了一種完全不同的較有效的編程和執行環境,你可以將獨立的程序模組創建爲較小的 DLL 檔案,並可對它們單獨編譯和測試。在執行時,只有當 EXE 程序確實要調用這些 DLL 模組的情況下,系統纔會將它們裝載到內存空間中。

這種方式不僅減少了 EXE 檔案的大小和對內存空間的需求,而且使這些 DLL 模組可以同時被多個應用程序使用。Windows 自己就將一些主要的系統功能以 DLL 模組的形式實現。

一般來說,DLL 是一種磁盤檔案,以.dll、.DRV、.FON、.SYS 和許多以 .EXE 爲副檔名的系統檔案都可以是 DLL。它由全局數據、服務函數和資源組成,在執行時被系統加載到調用進程的虛擬空間中,成爲調用進程的一部分。

如果與其它 DLL 之間沒有衝突,該檔案通常映射到進程虛擬空間的同一地址上。DLL 模組中包含各種匯出函數,用於向外界提供服務。

DLL 可以有自己的數據段,但沒有自己的堆棧,使用與調用它的應用程序相同的堆棧模式;一個 DLL 在內存中只有一個實例;DLL 實現了代碼封裝性;DLL 的編制與具體的編程語言及編譯器無關。 在 Win32 環境中,每個進程都複製了自己的讀/寫全局變量。

如果想要與其它進程共享內存,必須使用內存映射檔案或者聲明一個共享數據段。DLL 模組需要的堆棧內存都是從執行進程的堆棧中分配出來的。

Windows 在加載 DLL 模組時將進程函數調用與 DLL 檔案的匯出函數相匹配。Windows 操作系統對 DLL 的操作僅僅是把 DLL 映射到需要它的進程的虛擬地址空間裏去。

DLL 函數中的代碼所創建的任何對象(包括變量)都歸調用它的線程或進程所有。 調用方式: 1、靜態調用方式:由編譯系統完成對 DLL 的加載和應用程序結束時 DLL 卸載的編碼(如還有其它程序使用該 DLL,則 Windows 對 DLL 的應用記錄減1,直到所有相關程序都結束對該 DLL 的使用時才釋放它,簡單實用,但不夠靈活,只能滿足一般要求。

隱式的調用:需要把產生動態連接庫時產生的 .LIB 檔案加入到應用程序的工程中,想使用 DLL 中的函數時,只須說明一下。隱式調用不需要調用 LoadLibrary() 和 FreeLibrary()。

程序員在建立一個 DLL 檔案時,連結程序會自動生成一個與之對應的 LIB 匯入檔案。該檔案包含了每一個 DLL 匯出函數的符號名和可選的標識號,但是並不含有實際的代碼。

LIB 檔案作爲 DLL 的替代檔案被編譯到應用程序項目中。 當程序員透過靜態連結方式編譯生成應用程序時,應用程序中的調用函數與 LIB 檔案中匯出符號相匹配,這些符號或標識號進入到生成的 EXE 檔案中。

LIB 檔案中也包含了對應的 DL L檔案名(但不是完全的路徑名),連結程序將其存儲在 EXE 檔案內部。 當應用程序執行過程中需要加載 DLL 檔案時,Windows 根據這些資訊發現並加載 DLL,然後透過符號名或標識號實現對 DLL 函數的動態連結。

所有被應用程序調用的 DLL 檔案都會在應用程序 EXE 檔案加載時被加載在到內存中。可執行程序連結到一個包含 DLL 輸出函數資訊的輸入庫檔案(.LIB檔案)。

操作系統在加載使用可執行程序時加載 DLL。可執行程序直接透過函數名調用 DLL 的輸出函數,調用方法和程序內部其 它的函數是一樣的。

2、動態調用方式:是由編程者用 API 函數加載和卸載 DLL 來達到調用 DLL 的目的,使用上較複雜,但能更加有效地使用內存,是編制大型應用程序時的重要方式。 顯式的調用: 是指在應用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 顯式的將自己所做的動態連接庫調進來,動態連接庫的檔案名即是上面兩個函數的參數,再用 GetProcAddress() 獲取想要引入的函數。

自此,你就可以象使用如同本應用程序自訂的函數一樣來調用此引入函數了。在應用程序退出之前,應該用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 釋放動態連接庫。

直接調用 Win32 的 LoadLibary 函數,並指定 DLL 的路徑作爲參數。LoadLibary 返回 HINSTANCE 參數,應用程序在調用 GetProcAddress 函數時使用這一參數。

GetProcAddress 函數將符號名或標識號轉換爲 DLL 內部的地址。程序員可以決定 DLL 檔案何時加載或不加載,顯式連結在執行時決定加載哪個 DLL 檔案。

使用 DLL 的程序在使用之前必須加載(LoadLibrary)加載DLL從而得到一個DLL模組的句柄,然後調用 GetProcAddress 函數得。

6. 講講DLL檔案的做用與如何開啟

動態連結庫是一個能夠被應用程序和其它的DLL調用的過程和函數的集合體,它裏面包含的是公共代碼或資源。

由於DLL代碼使用了內存共享技術,在某些地方windows也給了DLL一些更高的權限,因而DLL中可以實現一些一般程序所不能實現的功能,如實現windows的HOOK、ISAPI等。同時,DLL還爲不同語言間代碼共享提供了一條方便的途徑。

因而DLL在編程時應用較爲廣泛,本文將介紹如何在 Delphi 中建立和使用DLL。 一.DLL 庫內存共享機制 從使用效果看,DLL和unit 很像,它們都可以被別的工程模組所調用,但二者在內部的實現機制上確存在着差別。

如果一個程序模組中用uses語句引用了某個unit,編譯程序在編譯該模組時,便會連同unit一起編譯,並把編譯後的可執行代碼連結到本程序模組中,這就是一個程序模組能夠調用所引用unit中過程和函數的原因。當同一個unit被多個工程所引用時,則每個工程中都含有該unit的可執行代碼,當含有該unit的多個工程同時執行時,unit的可執行代碼會隨不同工程而多次被調入內存,造成內存資源的浪費。

DLL則不同,它即使被某個工程調用,編譯後仍是獨立的,也就是說編譯後,一個DLL庫形成一個單獨的可執行檔案,而不與任何其它的可執行檔案連接在一起,因而DLL庫並不從屬於某個特定的工程,當多個工程調用同一個DLL庫時只有第一個工程把DLL庫調入內存,其餘工程並不重複調入同一個DLL庫到內存,而是到同一個共享內存區讀取。並且,DLL的執行代碼是在程序執行期間動態調入的,而不是如unit在程序執行時就與整個工程一起調入內存。

這樣便可消除unit帶來的相同代碼多處佔用內存的弊病。 二 Delphi中DLL庫的建立 在Delphi環境中,編寫一個DLL同編寫一個一般的應用程序並沒有太大的區別。

事實上作爲DLL主體的DLL函數的編寫,除了在內存、資源的管理上有所不同外,並不需要其它特別的手段。 一般工程檔案的格式爲: program 工程標題; uses 子句; 程序體 而DLLs工程檔案的格式爲: library 工程標題; uses 子句; exprots 子句; 程序體 它們主要的區別有兩點: 1.一般工程檔案的頭標用program關鍵字,而DLL工程檔案頭標用library 關鍵字。

不同的關鍵字通知編譯器生成不同的可執行檔案。用program關鍵字生成的是.exe檔案,而用library關鍵字生成的是.dll檔案; 2.假如DLL要輸出供其它應用程序使用的函數或過程,則必須將這些函數或過程列在exports子句中。

而這些函數或過程本身必須用export編譯指令進行編譯。 在Delphi主選單file 中選new。

項,在彈出的視窗中雙擊DLL圖標,便會自動給出DLL源模組框架,如下: Library project1; {。註釋。

} uses SysUtils, Classes; begin end. 接下來便可在USES和begin之間加入想在該DLL中實現的過程和函數的定義,並用export和exprots保字把它們引出,以便別的模組引用,在begin和end之間加入初始化代碼,初始化代碼是用來對DLL變量初始化的。應注意,即便無初始化代碼begin與end也不可省略,如下例: library minmax; function Min(X, Y: Integer): Integer; export; begin if X < Y then Min := X else Min := Y; end; function Max(X, Y: Integer): Integer; export; begin if X > Y then Max := X else Max := Y; end; exports Min index 1, Max index 2; begin end. 經編譯後,並以minmax.DLL存盤後,一個DLL庫檔案便形成了。

三 DLL庫的訪問 訪問DLL庫有兩種方式,一種是靜態引用,另一種是動態引用。 用靜態引用這種方法裝入DLL要做兩件事情:爲DLL 庫創建一個輸入單元,以及用USES把輸入單元連接到要使用DLL 函數的程序模組中。

爲DLL庫創建的輸入單元與普通的單元的區別僅在於:在它的接口處聲明的過程、函數,並不在它的實現部分給出真正的實現代碼,而是用external關鍵字把過程、函數的實現細節委託給外部DLL模組。 external命令的使用語法如下: procedure /function 過程/函數名;external DLL模組名; 下面給出爲上面創建的minmax.DLL庫寫的輸入單元源檔案testdll .pas,從中可看出輸入單元與一般單元的一些差別,代碼如下所示: unit testdll; interface uses function Min (X, Y: Integer): Integer; function Max (X, Y: Integer): Integer; implementation function Min; external 'minmax.DLL'; function Max; external 'minmax.DLL'; end. 一個應用程序若想調用minmax.DLL中的函數,只須在其uses語句中加入testdll 單元即可。

動態裝入DLL,要用到Windows的三個API函數。Loadlibrary、Freelibrary和GetprocAddress 。

loadlibrary函數用來裝入DLL庫,其調用格式如下: function loadlobrary (DLLfileName:Pchar): THandle: 當不再需要一個DLL庫時,應調用FreeLibrary函數將其釋放,以空出寶貴的內存資源,其調用格式如下: procedure FreeLibrary (Libmodule:THandle) Libmodule 爲由LoadLibrary調用得到的DLL庫句柄。在用loadlobrary 函數裝入某個DLL庫和調用FreeLibrary釋放該DLL庫之間的程序段中, 可以使用該DLL庫中的過程和函數,具體使用方法是:用GetprocAddress函數把DLL庫中函數的地址傳遞給程序中某個函數變量,再用該變量實現DLL函數。

7. DLL格式的檔案怎麼創建

DLL檔案是動態連結庫。一般情況下程序裏有方程來把不同的功能分類,下面這個例子就是算長方形面積的。但是當你的程序會很多次用到這個方程的時候,dll可以吧方程存起來給不同程序反覆使用。(比如同是有兩個程序都需要算長方形面積)

另外,dll最大優勢就是這些檔案都是在程序執行的時候纔會被調用。而不是像一般方程都是在編譯的時候調用的。

以C++爲例,另外我就當你對dll是什麼和基本編程已經有了解了。

最簡單創建dll的方法就是用VC++.net

1.先新創建一個 WIN32程序 的project,給個名字(dllexample)

2.在第2步點程序設定,選dll,點完成

3.在dllexample.cpp裏面,寫你要的function.這裏是一個算長方形面積的function.

在function定義之前的extern "C" __declspec(dllexport)就告訴編譯器這個function是可以給其他程序在runtime用的。

*********************************************************

// dllexample.cpp : Defines the entry point for the DLL application.

//

#include "stdafx.h"

extern "C" __declspec(dllexport)double BoxArea(double Length,double Width);

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

double BoxArea(double Length, double Width){

return Length * Width;

}

****************************************************************

4. 在主選單選編譯porject

5. 在你project存的地方的debug檔案夾裏就應該可以看見dllexample.dll和dllexample.lib兩個檔案了

6.接下來你就可以在你的程序裏用

extern "C" __declspec(dllimport)來執行dllexample.dll裏面的function了。(*.dll和*.lib必須和*.exe在同一個檔案夾裏。)

Tags:dll 檔案