2015年3月10日 星期二

DLL


動態連結檔的目的, 就只是共用程式而已, 很單純.

為什麼要共用程式? 如果某段程式, 有許多程式都要用到, 如果都直接寫在exe裡, 那麼一個程式就一份, n個程式便有n份, 使用dll便可以節省成為一份, 這樣共用程式佔用的記憶體便會比較少. 如果該dll已有別人使用, 再執行需要該dll的程式時, 便不必再將該dll重新由硬碟載入, 初始執行的時間相對地也減少. 

使用dll的另一個好處是, 可以不公開程式碼便能分享給別人使用.

*** 其他的相關知識 ***

傳統動態連結檔都可以採用靜態呼叫或動態呼叫. 靜態呼叫指的是經由.lib連結 (Linux則是用-l指定連結, 但檔名必須lib開頭). 當程式執行時, 系統會自動載入該動態連結檔.

動態呼叫是, 當程式有需要時, 才去載入動態連結檔進行呼叫. Windows是使用LoadLibrary配GetProcAddress, Linux是使用dlopen配dlsym.

Windows的.dll檔, 除了傳統的動態連結檔外, 還包括COM與.net元件檔, 這三者的程式架構與呼叫法都完全不同, 雖然副檔名都是dll, 但並不能混為一談.

對於VC++的傳統動態連結檔, 還區分為regular dll與MFC extension dll, 前者指的是可給其他程式(例如VB)使用的dll, 後者是專門給有使用MFC的執行檔使用, 兩者間還是有點差異.




2007/6/12 上午 09:15:55
VC++ DLL 網友的實作經驗如下:

靜態連結: (指的是Compiler階段就連結)
1.先把寫好的DLL compiler,compiler後會產生xxx.DLL 跟xxx.LIB,然後這兩個檔案複製到xxx.c (你的執行檔的原碼)目錄下(印象中好像只要xxx.LIB就可以了。)
2. 然後Compiler xxx.c 變成xxx.EXE。
3. 呼叫xxx.DLL內的函數的時候,直接使用原本名稱就可以了。
4.執行的時候xxx.EXE 要跟xxx.DLL放一起

動態聯結: (指的是執行階段才連結)
1.在你的xxx.c 中去呼叫API LoadLibary()方式去使用你在xxx.DLL中的函數
2.直接Compiler xxx.c 變成xxx.exe
3.把xxx.exe 跟xxx.dll 放一起才能執行。

不管哪一種連結方式,都是把一些程式碼放在xxx.DLL中,只是呼叫的方式跟Compiler方式不太一樣,有時間你自己比較一下就會知道了。

DLL的函數匯出(Export ,簡單說就是哪些函數可以被你的xxx.exe呼叫):
看你要不要使用xxx.def or 利用標頭檔 Export 你的函數,我的經驗是而使用xxx.def 方式最簡單,其他細節請參閱DLL相關說明。

P.S DLL有分成MFC DLL/一般DLL...我是初學者,剛摸沒多久,所以沒寫過MFC,所以上述是一般標準VC++ DLL方式,如有誤請前輩指正。



什麼是DLL?

DLL 是動態連結程式庫, DLL提供一種方法,讓處理序 (Process) 呼叫不是可執行程式碼部分的函式。函式的可執行程式碼位於 DLL 裡,它包含一或多個已編譯、連結的函式,並且儲存在與使用它們的處理序不同的地方。 例如, 我們開發的Canvas, Gesture Handler, Rubik's Cube...等一些應用程式, 都會利用OTMUT.dll來開發Touch/Gesture的相關功能。 這有助於提升程式碼重複使用及有效率的記憶體使用量。

應用程式和 DLL 之間的差異?
雖然 DLL 和應用程式都是可執行程式模組, 但是它們在許多方面卻是不同。對使用者而言,最明顯的差異在於 DLL 不是可以直接執行的程式. 從系統觀點來看,應用程式和 DLL 之間有兩個基本差異: 
  • 應用程式本身可以同時在系統中執行多個執行個體,而 DLL 只能有一個執行個體。
  • 應用程式可以擁有如堆疊、全域記憶體、檔案控制代碼 (File Handle) 和訊息佇列等,而 DLL 則不含這些
動態連結與靜態連結的差異?

動態連結(Dynamic Link Libraries)允許可執行模組 (.DLL 或 .EXE 檔) 只包含在執行階段時用來找出 DLL 函式可執行程式碼的所需資訊。
在靜態連結(Static-Link Libraries)中,連結器 (Linker) 會從靜態連結程式庫取得所有參考函式,並且將它與您的程式碼一起放入可執行檔,它的內容除了程式設計者所設計的程式碼之外,還包含了所使用程式庫的程式碼,所以其檔案變得相當大。

http://support.microsoft.com/kb/815065/zh-tw

DLL 的優點

  • 使用較少的資源
    當多個程式使用相同的媒體櫃的函式, DLL 可以減少重複的程式碼, 會在磁碟上及實體記憶體中載入。 這會大幅影響效能的執行在前景, 不只是程式還 Windows 作業系統上正在執行的其他程式。
  • 模組化結構升級
    DLL 有助於提升開發模組化的程式。 這可協助您開發大型的程式需要有多個語言版本或需要模組化結構的程式。 範例的模組化的程式是帳戶程式有許多可在 Run Time 動態載入的模組。
  • 簡化部署和安裝
    當函式在 DLL 內需要的更新程式或修正程式, 部署和安裝的 DLL 不需要程式, 以與 DLL 重新連結。 除此之外, 如果多個程式使用同一個 DLL, 多個程式將所有獲益更新或修正程式。 當您使用協力廠商 DLL, 定期更新或修正這個問題的發生原因, 是更頻繁地。


在 Windows 作業系統中的檔案:
  • ActiveX 控制項 (. ocx) 檔案
    ActiveX 控制項的範例是行事曆控制項, 可讓您從行事曆中選取一個日期。
  • 控制台 ] (cpl) 檔案
    cpl 檔案的範例是一個項目是位於 [ 控制台 ] 中。 每個項目都是特定的 DLL。
  • 裝置驅動程式 (drv) 檔案
    範例的裝置驅動程式是印表機驅動程式, 以控制列印至印表機。

DLL 相依性

當程式或 DLL 會在另一個 DLL 中使用的 DLL 函式時,會建立相依性。
  • ActiveX 控制項 (.ocx) 檔案
  • ActiveX 控制項的一個例子是可讓您從行事曆選取日期的行事曆控制項。
  • 控制控制台 (.cpl) 檔案
  • .Cpl 檔案的範例是位於 [控制台] 中的項目。
這些動作通常稱為 「 DLL 衝突。




在系統檔案中,有一種類型的檔案常常被各種程式所使用,而且當程式發生錯誤時,也常常會顯示這類檔案的訊息。這個檔案就是DLL檔。當程式出現問題時,我們可能常常會看到類似這種訊息:「xxx.dll發生錯誤,請關閉程式或洽系統管理人員」。

DLL的全名為Dynamic Link Library,一般翻為「動態連結資料庫」。它是系統中的一種「公用檔」,可以視為作業系統與許多應用程式的「共用材料」。當某個DLL發生問題時,所有必須使用這個「共用材料」的程式功能就無法順利執行,然後就可能出玩上述那種錯誤訊息。Windows含有一大堆各式各樣的DLL檔,它們所執掌的功能,大多屬於各種程式所常見的功能,例如當我們在任何程式中開啟視窗時,都會看到相同的外觀(例如它們的右上角都有三個分別代表「縮小」、「放大」、「關閉」的按鈕),操作方式也都相同,這就是Windows內建的標準DLL元件之一,任何程式想要執行視窗的開啟功能時,只要呼叫這個元件來執行即可。同樣,例如對話框、按鈕等常見的必備功能,都是由相關的DLL檔案來負責。

事實上,Windows可以看成由許DLL檔所組成的一套作業系統,這種方式可以讓作業系統容易開發與擴充,例如當作業系統相要對原有功能予以強化或加入一些新功能時,只要對舊有的DLL檔予以更新,或加上新的DLL檔即可,不必重撰寫整套程式碼,節省許多時間與複雜度。

這種做法不僅可以簡化作業系統本身的開發與擴充工作,對任何應用程式的開發而言也較方便。因為開發者可以專注在自己的特定功能,其他一 些Windows環境的標準功能,就交給作系統去負責即可。

此外,這還有一種好處,就是使用者不論使用任何程式,都會接觸相同的基本操作方式,不必每次都重新學習新的操作方法,否則若每個程式都有自己獨特的操作方式,那使用者鐵定受不了。

DLL不僅負責許多基本功能,它還負責一些特定應用的常見功能,例如在Internet環境中,就有一個相當知名的Winsock.dll檔來負責Internet環境中兩台電腦之間的底層溝通。

DLL會出問題,常常發生在兩種情形,一種是某個程式「秀逗」時,它所用到的DLL檔也連帶被系統鎖死,無法被其他程式所用使用,當這個DLL檔屬於核心檔案時,就可能導致一連串的錯誤,甚至當機。

另一種則是DLL檔的版本錯誤。由於功能的不斷強化,各種DLL檔都會常常更新。在更新作業系統時,新版的DLL檔會取代舊的,而在應用程式的安裝過程中,也會出現這種新版取代舊版的情形。當程式在安裝過程中,偵測出系統中已經擁有較新的版本時,一般都會出現訊息告知使用者,並建議保留新版,但若您不小心反而用舊版取代新版時,則日後如果有其他程式也要用到這個DLL時,就可能發生問題囉!

Windows dll 遺失


網站:DLL-files.com

如何將下載好的.dll檔加入電腦?
下載後的檔案是 ZIP 壓縮檔,你必須先解壓縮並將 .dll 檔複製到Windows系統目錄。
通常是 C:\Windows\System (Windows 95/98/Me), 
C:\WINNT\System32 (Windows NT/2000), 或
C:\Windows\System32 (Windows XP) 。
你也許要將 dll 檔放到應用程式指定的資料夾內,
若使用上述的方式還無法解決問題,你可能就必須使用 regsvr32 ,方法如下:
  1. 點選開始 -> 執行
  2. 輸入 CMD 後按下確認
  3. 輸入 regsvr32 “檔名.dll” 然後在按下確認。這樣做就能解決問題。
如果要尋求更多的線上支援服務,可以在 DLL-files.com 的 Live Support 系統註冊。

如果.dll要覆蓋的時候出現檔案使用中或無法覆蓋怎麼辦?
不用急,你可以試著先重新開機,然後在開機時按F8進到安全模式,在安全模式裡再做一次檔案覆蓋,應該就可以覆蓋過去了。
備註:通常會遺失或毀損的dll檔都是放在windows資料夾中的system32中。