動態連接庫英文爲DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。html
動態連接提供了一種方法,使進程能夠調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。編程
動態連接庫(Dynamic Link Library或者Dynamic-link library,縮寫爲DLL),是微軟公司在微軟視窗操做系統(即Windows操做系統)中實現共享函數庫概念的一種方式。這些庫函數的擴展名是.DLL、.OCX(包含ActiveX控制的庫)或者.DRV(舊式的系統驅動程序)。
動態連接庫縮寫爲DLL,在電腦中能夠更爲容易地將更新應用於各個模塊,而不會影響該程序的其餘部分。例如,您有一個大型網絡遊戲,若是把整個數百MB甚至數GB的遊戲的代碼都放在一個應用程序裏,日
動態連接庫
後的修改工做將會十分費時,而若是把不一樣功能的代碼分別放在數個動態連接庫(DLL)中,您無需從新生成或安裝整個程序就能夠應用更新。
就下表說明了 Windows操做系統中的一些做爲 DLL 實現的文件:
ActiveX控件的一個示例是日曆控件,它使您能夠從日曆中選擇日期。
.cpl 文件的一個示例是位於控制面板中的項。每一個項都是一個專用 DLL。
動態連接庫文件,是一種不可執行的二進制程序文件,它容許程序共享執行特殊任務所必需的代碼和其餘資源。Windows提供的DLL文件中包含了容許基於Windows的程序在Windows環境下操做的許多函數和資源。通常被存放在C:\Windows\System目錄下。
Windows中,DLL多數狀況下是帶有DLL擴展名的文件,但也多是EXE或其餘擴展名;Debian系統中經常是.so的文件。它們向運行於Windows操做系統下的程序提供代碼、數據或函數。程序可根據DLL文件中的指令打開、啓用、查詢、禁用和關閉驅動程序。
一、擴展了應用程序的特性;
二、能夠用許多種編程語言來編寫;
三、簡化了軟件項目的管理;
四、有助於節省內存;
五、有助於資源共享;
六、有助於應用程序的本地化;
七、有助於解決平臺差別;
八、能夠用於一些特殊的目的。windows使得某些特性只能爲DLL所用。
dll圖標
工具查殺後並未對dll文件進行系統修復,因此常常會出現如下現象:
一、可執行程序沒法打開
二、電腦沒聲音
三、電腦藍屏
四、桌面沒法顯示
五、主頁被修改
六、桌面圖標沒法刪除(淘寶、小遊戲、電影等等,重啓一樣不能正常刪除)
當某個程序或 DLL 使用其餘 DLL 中的 DLL 函數時,就會建立依賴項。所以,該程序就再也不是獨立的,而且若是該依賴項被損壞,該程序就可能遇到問題。例如,若是發生下列操做之一,則該程序可能沒法運行:
· 依賴 DLL 升級到新版本。
· 修復了依賴 DLL。
· 依賴 DLL 被其早期版本覆蓋。
· 從計算機中刪除了依賴 DLL。
這些操做一般稱爲 DLL 衝突。若是沒有強制實現向後兼容性,則該程序可能沒法成功運行。
在建立 DLL 時,能夠有選擇地指定入口點函數。當進程或線程將它們自身附加到 DLL 或者將它們自身從 DLL 分離時,將調用入口點函數。您可使用入口點函數根據 DLL 的須要來初始化數據結構或者銷燬數據結構。此外,若是應用程序是多線程的,則能夠在入口點函數中使用線程本地存儲(TLS) 來分配各個線程專用的內存。下面的代碼是一個 DLL 入口點函數的示例:
BOOL APIENTRY DllMain(
HANDLE hModule, // DLL模塊的句柄
DWORD ul_reason_for_call, // 調用本函數的緣由
LPVOID lpReserved ) // 保留
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
//進程正在加載本DLL
break;
case DLL_THREAD_ATTACH:
//一個線程被建立
break;
case DLL_THREAD_DETACH:
//一個線程正常退出
break;
case DLL_PROCESS_DETACH:
//進程正在卸載本DLL
break;
}
return TRUE;
//返回TRUE,表示成功執行本函數
}
當入口點函數返回 FALSE 值時,若是您使用的是加載時動態連接,則應用程序不啓動。若是您使用的是運行時動態連接,則只有個別 DLL 不會加載。
入口點函數只應執行簡單的初始化任務,不該調用任何其餘 DLL 加載函數或終止函數。例如,在入口點函數中,不該直接或間接調用 LoadLibrary 函數或LoadLibraryEx 函數。此外,不該在進程終止時調用FreeLibrary函數。
注意:在多線程應用程序中,請確保將對 DLL 全局數據的訪問進行同步(線程安全),以免可能的數據損壞。爲此,請使用 TLS 爲各個線程提供惟一的數據。
要導出 DLL 函數,您能夠嚮導出的 DLL 函數中添加函數關鍵字,也能夠建立模塊定義文件(.def) 以列出導出的 DLL 函數。
方法1、嚮導出的 DLL 函數中添加函數關鍵字
要使用函數關鍵字,您必須使用如下關鍵字來聲明要導出的各個函數:
__declspec(dllexport)
要在應用程序中使用導出的 DLL 函數,您必須使用如下關鍵字來聲明要導入的各個函數:
__declspec(dllimport)
一般狀況下,您最好使用一個包含 define 語句和 ifdef 語句的頭文件,以便分隔導出語句和導入語句。
方法2、建立模塊定義文件(.def) 以列出導出的 DLL 函數
使用模塊定義文件來聲明導出的 DLL 函數。當您使用模塊定義文件時,您沒必要嚮導出的 DLL 函數中添加函數關鍵字。在模塊定義文件中,您能夠聲明 DLL 的 LIBRARY 語句和 EXPORTS 語句。
關於特定狀況下的調用,好比DLL函數中使用到了win32 API或者將C++生成的DLL供標準C語言使用,則須要注意如下一些狀況:
若是使用到了win32 API,則應該使用調用方式爲「__stdcall」。
在將C++生成的DLL供標準C語言使用,輸出文件須要用「extern "C"」修飾,不然不能被標準C語言調用。若是使用「__stdcall」調用方式,可能產生C不識別的修飾名,因此設置導出函數時要採用.def文件形式,而不是__declspec(dllexport)形式。後者會進行修飾名轉換,C語言沒法識別函數。
// SampleDLL.def
//
LIBRARY "sampleDLL"
EXPORTS
HelloWorld示例 DLL 和應用程序XXXXXXXX 在 MicrosoftVisual C++6.0 中,能夠經過選擇「Win32動態連接庫」項目類型或「MFC應用程序嚮導(dll)」來建立 DLL。下面的代碼是一個在 Visual C++ 中經過使用「Win32 動態連接庫」項目類型建立的 DLL 的示例。
// SampleDLL.cpp
#include "stdafx.h"
#define EXPORTING_DLL
#include "sampleDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
void HelloWorld(){
MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
}
// File: SampleDLL.h
#ifndef INDLL_H
#define INDLL_H
#ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;
#elseextern __declspec(dllimport) void HelloWorld() ;
#endif
#endif
下面的代碼是一個「Win32應用程序」項目的示例,該示例調用 SampleDLL DLL 中的導出 DLL 函數。
// SampleApp.cpp
//#include "stdafx.h"
#include "sampleDLL.h"
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HelloWorld();
return 0;
}
注意:在加載時動態連接中,您必須連接在生成 SampleDLL 項目時建立的 SampleDLL.lib導入庫。
在運行時動態連接中,您應使用與如下代碼相似的代碼來調用 SampleDLL.dll導出 DLL 函數。
...
typedef VOID (*DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL = LoadLibrary("sampleDLL.dll");
if (hinstDLL != NULL)
{
HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");
if (HelloWorld != NULL)
(HelloWorld);
fFreeDLL = FreeLibrary(hinstDLL);
}
...
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之DLL(Delay Locked Loop,延時鎖定迴路提供一個數據濾波信號)
系統文件auditpolicygpinterop.dll出錯,是因爲木馬病毒、或不當心下載了流氓軟件被感染所致。而該文件又是系統/程序正常運行的前提條件,因此一旦不幸被感染,一般會伴隨下幾種狀況:
一、桌面圖標沒法刪除(淘寶、遊戲、小電影等等,重啓一樣不能正常刪除)
二、網絡遊戲打不開(DNF,穿越火線,魔獸世界等等)
三、電腦無端藍屏
四、電腦沒聲音
五、桌面沒法顯示
1.部分.dll缺失能夠從其餘電腦或者網上下載拷貝到,c盤windows目錄下來完成修復。
2.經過文件恢復器來恢復。
3.auditpolicygpinterop.dll出錯,不少是由於中了流氓軟件的招,若是不太瞭解系統,不知道應該把auditpolicygpinterop.dll放在哪,那麼建議使用修復工具對系統進行最全面的掃描和修復。
DLL是編譯好的代碼,與通常程序沒什麼大差異,只是它不能獨立運行,須要程序調用。那麼,DLL與木馬能扯上什麼關係呢?若是你學過編程而且寫過DLL,就會發現,其實DLL的代碼和其餘程序幾乎沒什麼兩樣,僅僅是接口和啓動模式不一樣,只要改動一下代碼入口,DLL就變成一個獨立的程序了。固然,DLL文件是沒有程序邏輯的,這裏並非說DLL=EXE,不過,依然能夠把DLL看作缺乏了main入口的EXE,DLL帶的各個功能函數能夠看做一個程序的幾個函數模塊。
DLL木馬就是把一個實現了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是一個普通的DLL,可是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然一樣的代碼就能夠實現木馬功能,那麼直接作程序就能夠,爲何還要畫蛇添足寫成DLL呢?這是爲了隱藏,由於DLL運行時是直接掛在調用它的程序的進程裏的,並不會另外產生進程,因此相對於傳統EXE木馬來講,它很難被查到。
動態連接庫(DLL)地獄——當使用COM組件的應用程序被安裝在一臺機器上,在安裝過程當中會更新註冊表的COM組件信息。所以,有這些DLL時,將被覆蓋一些其餘的應用程序在同一臺計算機上安裝了一個機會。所以,應用程序,指的是一個特定的DLL錯誤的DLL。這形成了重大的問題,當一個應用程序指的是一個特定版本的DLL。[1]