110 likes | 329 Views
DLL 介紹. 4.10 王俊富. DLL 是甚麼. 動態鏈接庫( Dynamic Link Library 或者 Dynamic-linklibrary ,縮寫為 DLL ),又稱為動態連結函式庫,是微軟公司在微軟視窗操作系統中實現共享函數庫概念的一種實作方式。 這些函式庫的擴展名是 DLL 、 OCX (包含 ActiveX 的控制庫)或者 DRV (舊式的系統驅動程序 ) 。. DLL 可以做甚麼.
E N D
DLL介紹 4.10 王俊富
DLL是甚麼 • 動態鏈接庫(Dynamic Link Library或者Dynamic-linklibrary,縮寫為DLL),又稱為動態連結函式庫,是微軟公司在微軟視窗操作系統中實現共享函數庫概念的一種實作方式。 這些函式庫的擴展名是DLL、OCX(包含ActiveX的控制庫)或者DRV(舊式的系統驅動程序)。
DLL可以做甚麼 • DLL提供給Windows執行程式時所需的資料(data)或是執行函數(executable functions),有些DLL會在安裝Windows後產生( windowssystem ),提供給Windows程式使用,另外也有一些其它的軟體自己會安裝上去。 • 微軟當初為Windows設計動態連結檔主要是擷取它的兩項優點:一是資源共享、一是動態連結。
動態連結檔可以資源共享 • 如果函數庫為DLL形式,則編譯之後,函數庫並不會成為執行檔的一部分,而將來如果應用程式A、B、C同時被執行,則系統只會載入一份函數庫讓程式A、程式B、程式C共用。
動態連結檔節省記憶體空間 • 資源共享節省磁碟空間,而動態載入可以節省記憶體空間。動態載入讓程式檔在需要相關的函數或資源的時候,才載入放置在動態連結檔裡面的函數或資源,這種方式將可以有效地使用記憶體。不論是節省磁碟空間或記憶體空間,都是希望利用動態連結檔所提供的共享函數與系統資源的方式,降低整個Windows環境對於硬體設備的需求。
DLL的問題 - DLL Hell • 之所以出現DLL Hell,是因為動態連結檔可以與其他程式共用函數、共享資源所引起 • 為了要讓其他程式共用動態連結檔所提供的函數或資源,動態連結檔的設計者必須相當謹慎地、縝密地考慮到功能的一致性、回溯相容等細節問題,否則一旦程式所使用動態連結檔沒有提供所預期的功能,那麼使用者就會為此而掉入地獄了。
用VC6寫出DLL檔跟呼叫它 • 1. 第一步驟,建製DLL: • New >> Projects >> Win32 Dynamic-link library • 建立hello空專案,新增hello.h, hello.c • // hello.h_______________________________________________ • #ifdef __cpluscplus • #define EXPORT extern "C" __declspec(dllexport) • #else • #define EXPORT __declspec(dllexport) • #endif • EXPORT void hello(); • // end hello.h___________________________________________
用VC6寫出DLL檔跟呼叫它 • // hello.c_______________________________________________ • #include"hello.h" • #include<stdio.h> • #include<windows.h> • EXPORT void hello(){ • printf("The First Hello World !"); • } • int __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, PVOID pvReserved){ • return TRUE; • } • // end hello.c_____________________________________________
用VC6寫出DLL檔跟呼叫它 • 然後compiler, and link. • 不需要execute, 你會在專案內找到三個必備的檔案: • hello.h, hello.lib, hello.dll
用VC6寫出DLL檔跟呼叫它 • 第二步驟,使用DLL 建立一般的空專案,新增main.c // main.c ________________________________________________ #include"hello.h" int main(){ hello(); return 0; } // end main.c _____________________________________________ • 將之前的hello.h, hello.lib, hello.dll放在main.c同一資料夾中。 • vc6加入lib( 上面選單 >> Project >> Add to project >> Files >> 選擇加入hello.lib進入專案中 ) 然後compiler, link, execute.
用VC6寫出DLL檔跟呼叫它 • 第三步驟,替代DLL 以後.exe必須與.dll同一資料夾內。 需要更換dll時,請重複第一步驟重新建製一個DLL, 不過只需要拿新的DLL取代舊的DLL就可以, 第二步驟可以完全省略。 例如你可以將hello.c中的 printf("The First Hello World !"); 改成 printf("The Second Hello World !"); compiler, link取得hello.dll 然後直接丟到main.c專案中取代舊的hello.dll main.exe不需要compiler, link, 直接execute就可以了。