下面這篇文章是我從別的地方轉載過來的,看完覺得比較好,所以就做了個reshipment,好東西大家一起研究呵呵。為尊重別人的智慧財產權,事先聲明一下!
什麼是DLL呢?
DLL(動態串連庫),既然是動態,那麼就是有靜態串連庫,我想如果這麼說大家會更明白:
也許有的人在DOS下編寫過程式都明白這麼一件事情,我寫了一個程式,裡面有一個功能就是把螢幕的內容翻轉在轉90°列印出來,那麼我需要把整個程式寫好放
到我的所有代碼中,但是如果我寫另外一個程式的時候也有相通的功能,我可以
調用以前的程式這個功能嗎?當然是不可以的了,所以我就要重新的寫一次,如
果有5個需要調用這個功能的程式,我的這個功能函數需要20K的地方,那麼我的
硬碟就有80K的垃圾出現(20k*5 - 20k),這僅僅是一個函數,大家是否可以數
清除WINDOWS如果這樣來寫,需要多少函數嗎?你看看所有的按鈕、捲軸、
Listbox\Textbox\checkBox\表單、列印對話方塊、顏色對話方塊、開啟、儲存、另存
、字型對話方塊、檔案的排列、拷貝、粘貼...... 這一切的一切是不是都需要在所
有的程式中都要寫出來呢?如果真的是這個樣子,那麼我們的windows應該按TB來
計算了(1TB=1024GB),也許你說你的硬碟很大,那麼他們還要在啟動並執行時候占
用相同大下的內容呢!所以發展出來了,動態串連庫(dll)這個感念:
動態串連,就是把這些相通的功能、函數都放到一種特殊形式的windwos可執行文
件中(dll),產生一個DLL的時候,程式員需要寫出,其中包含那些函數需由其
他程式來訪問。這個過程叫做對函數的“匯出”
建立windows程式的時候,專門的串連程式對程式的對象檔案進行掃描,並產生一
個列表,列出那些調用的函數在那個DLL那個位置,指定各個函數所在位置的過程
叫做對函數的“匯入”,當程式啟動並執行時候,一旦要求用到執行檔案內部沒有的
函數,windows就會自動裝載動態串連庫,使應用程式可以訪問這些函數。此時,
每個函數的地址都會解析出來,並且以動態方式串連到程式裡--這便是術語
“動態串連”的由來。
另外還有一個好處,就是當你更新你的這個函數的版本和功能的時候,靜態串連
所需要做的工作是多少(假設按windwos來說他有上千個這樣的函數,一共有100
多個程式來使用,那靜態串連需要100000次的更新,動態串連只需要1000次)
,從而也節省了記憶體的空間。
動態串連庫不一定是DLL副檔名的,也可以是ocx、vbx、exe、drv 等等的
大家可以發現在調用WIN32 api的時候裡面都會有說明是來自於那個dll等宿主文
件的
現在我就在這裡講講一些標準的dll用途:
看下面這個API聲明:
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias
"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)
As Long
看見kernel32了嗎,其實這個就是kernel32.dll的名字,你可以在你的硬碟裡找
到他,這就是說GetWindowsDirectory這個函數是在kernel32.dll裡面,他的別名
是GetWindowsDirectoryA,()中是他的參數,有兩個一個是字元型,一個是長
整型,傳回值也是長整型。lpBuffer ------- String,指定一個字串緩衝區,
用於裝載Windows目錄名。除非是根目錄,否則目錄中不會有一個中止用的“\”
字元nSize ---------- Long,lpBuffer字串的最大長度,傳回值 為Long,複製
到lpBuffer的一個字串的長度。如lpBuffer不夠大,不能容下整個字串,就會返
回lpBuffer要求的長度。零表示失敗。
這就是API聲明的意義所在!
DLL的說明
KERNEL32.DLL ---- 低級核心功能。使用他可以完成記憶體管理、任務管理、
資源控制等。
USER32.DLL------於windows管理有關的函數。訊息、菜單、游標、計時器
、通訊和其他大多數非現實函數都可以從這裡找到
GDI32.DLL-------圖形裝置介面庫。於裝置輸出有關的函數:大多數繪圖
、顯示情境、圖元檔案、座標及其字型函數都可以從這梨找到。
COMDLG32.DLL\LZ32.DLL\VERSION.DLL\---這都是提供一些增益集函數的庫,包
括通用對話方塊、檔案壓縮、版本控制的支援。
COMCTL32.DLL --------一個新的windows控制項集合,比如TreeView和RichTextBox
等等,最初這個好像是為了win95而製作的,但是現在也使用與NT下
MAPI32.DLL---------提供了一套電子郵件的專用函數
NETAPI32.DLL--------提供了一套訪問和控制網路的函數
ODBC32.DLL--------(不用我再說了吧)ODBC功能的DLL之一
WINMM.DLL------(這可不是WINDOWS的MM)是多媒體控制訪問函數集合
windows api正在快速發展和變化,是你我任何單個人都追趕不上的速度發展,幸
運的是我們不用掌握所有的windows API,只是掌握需要經常使用的WINDOWs api
和他的常規結構、基本感念就可以了,這亮點很重要。
關於win32 API看我發的《什麼是win32 API》
這兩篇文章是我特意送給beijingfish和一些初學windows 編程的網友的,連夜敢制出來的,手都痛了!