❶ 如何查看一個dll是用什麼編譯器編譯的
dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
修改DLL文件的方法
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
❷ 新手月C++,編譯DLL是不是都會出現「調試會話的可執行文件」那個對話框
首先,你需要說明用的是什麼編譯器,vc或者是什麼。
調試悶蘆慎DLL,你需要把它掛接到一個可執行文件上面運行,嘩逗所以編譯器會問你螞敬要掛接到那個可執行文件去調試。
❸ VC6.0中彈對話框「rcdll.dll找不到資源編譯器的dll文件,請確認路徑是否正確」怎麼解決系統是Win7
是不是路徑問題?
LZ是不安裝完軟體之後還移動過?如果移動過,再放回原來的地方
❹ dll是什麼文件
DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。DLL文件一差含般被存放在C:WindowsSystem目錄下。
DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。例如,在 Windows 操作系統中,Comdlg32 DLL 執行與對話框有關的常見函數。因此,每個程序都可以使用該 DLL 中包含的功能來實現「打開」對話框。這有助於促進代碼重用和內存的有效使用。
通過使用 DLL,程序可以實現模塊化,由相對獨立的組件組成。例如,一個計帳程序可以按模塊來銷售。可以在運行時將各個模塊載入到主程序中(如果安裝了相應模塊)。因為模塊是彼此獨立的,所以程序的載入速度更快,而且模塊只在相應的功能被請求時才載入。
此外,可以更為容易地將更新應用於各個模塊,而不會影響該程序的其他部分。例如,您可能具有一個工資計算程序,而稅率每年都會更改。當這些更改被隔離到 DLL 中以後,您無需重新生成或安裝整個程序就可以應用更新。
Windows 操作系統中的一些作為 DLL 實現的文件:
·ActiveX 控制項 (.ocx) 文件
ActiveX 控制項的一個示例是日歷控制項,它使您可以從日歷中選擇日期。
·控制面板 (.cpl) 文件
.cpl 文件的一個示例是位於控制面板中的項。每個項都是一個專用 DLL。
·設備驅動程序 (.drv) 文件
設備驅動程序的一個示例是控制列印到列印機的列印機驅動程序。
DLL 的優點
當程序使用 DLL 時提供的一些優點:
·使用較少的資源
當多個程序使用同一個函數庫時,DLL 可以減少在磁碟和物理內存中載入的代碼的重復量。這不僅可以大大影響在前台運行的程序,而且可以大大影響其他在 Windows 操作系統上運行的程序。
·推廣模塊式體系結構
DLL 有助於促進模塊式程序的開發。這可以幫助您開發要求提供多個語言版本的大型程序或要求具有模塊式體系結構的程序。模塊式程序的一個示例是具有多個可以在運行時動態載入的模塊的計帳程序。
·簡化部署和安裝
當 DLL 中的函數需要更新或修復時,部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個程序使用同一個 DLL,那麼多個程序都將從該更新或修復罩碰中獲益。當您使用定期更新或修復的第三方 DLL 時,此問題可能會更頻繁地出現。
1、如何了解某應用程序使用哪些DLL文件
右鍵單擊該應用程序並選擇快捷菜單中的「快速查看」命令,在隨後出現的「快速查看」窗口的「引入表」一欄中你將看到其使用DLL文件的情況。
2、如何知道DLL文件被幾個程序使用
運行Regedit,進入HKEY_LOCAL_-
ersionSharedDlls子鍵查看,其右邊窗口中就顯示了所有DLL文件及其相關數據,其中數據右邊小括弧內的數字就說明虛悶笑了被幾個程序使用,(2)表示被兩個程序使用,(0)則表示無程序使用,可以將其刪除。
3、如何解決DLL文件丟失的情況
有時在卸載文件時會提醒你刪除某個DLL文件可能會影響其他應用程序的運行。所以當你卸載軟體時,就有可能誤刪共享的DLL文件。一旦出現了丟失DLL文件的情況,如果你能確定其名稱,可以在Sysbckup(系統備份文件夾)中找到該DLL文件,將其復制到System文件夾中。如果這樣不行,在電腦啟動時又總是出現「***dll文件丟失……」的提示框,你可以在「開始/運行」中運行Msconfig,進入系統配置實用程序對話框以後,單擊選擇「System.ini」標簽,找出提示丟失的DLL文件,使其不被選中,這樣開機時就不會出現錯誤提示了。
rundll的功能是以命令列的方式呼叫Windows的動態鏈結庫。
Rundll32.exe與Rundll.exe的區別就在於前者是呼叫32位的鏈結庫,後者是用於16位的鏈結庫。rundll32.exe是專門用來調用dll文件的程序。
如果用的是Win98,rundll32.exe一般存在於Windows目錄下;
如果用的WinXP,rundll32.exe一般存在於WindowsSystem32目錄下。
若是在其它目錄,就可能是一個木馬程序,它會偽裝成rundll32.exe。
DLL 故障排除工具
可以使用多個工具來幫助您解決 DLL 問題。以下是其中的部分工具。
Dependency Walker
Dependency Walker 工具可以遞歸掃描以尋找程序所使用的所有依賴 DLL。當您在 Dependency Walker 中打開程序時,Dependency Walker 會執行下列檢查:
·Dependency Walker 檢查是否丟失 DLL。
·Dependency Walker 檢查是否存在無效的程序文件或 DLL。
·Dependency Walker 檢查導入函數和導出函數是否匹配。
·Dependency Walker 檢查是否存在循環依賴性錯誤。
·Dependency Walker 檢查是否存在由於針對另一不同操作系統而無效的模塊。
通過使用 Dependency Walker,您可以記錄程序使用的所有 DLL。這可能有助於避免和更正將來可能發生的 DLL 問題。當您安裝 Microsoft Visual Studio 6.0 時,Dependency Walker 將位於以下目錄中:
drive\Program Files\Microsoft Visual Studio\Common\Tools
DLL Universal Problem Solver
DLL Universal Problem Solver (DUPS) 工具用於審核、比較、記錄和顯示 DLL 信息。下表說明了組成 DUPS 工具的實用工具:
·Dlister.exe:該實用工具枚舉計算機中的所有 DLL,並且將此信息記錄到一個文本文件或資料庫文件中。
·Dcomp.exe:該實用工具比較在兩個文本文件中列出的 DLL,並產生包含差異的第三個文本文件。
·Dtxt2DB.exe:該實用工具將通過使用 Dlister.exe 實用工具和 Dcomp.exe 實用工具創建的文本文件載入到 dllHell 資料庫中。
·DlgDtxt2DB.exe:該實用工具提供 Dtxt2DB.exe 實用工具的圖形用戶界面 (GUI) 版本。
DLL 的類型
當您在應用程序中載入 DLL 時,可以使用兩種鏈接方法來調用導出的 DLL 函數。這兩種鏈接方法是載入時動態鏈接和運行時動態鏈接。
1、載入時動態鏈接
在載入時動態鏈接中,應用程序像調用本地函數一樣對導出的 DLL 函數進行顯式調用。要使用載入時動態鏈接,請在編譯和鏈接應用程序時提供頭文件 (.h) 和導入庫文件 (.lib)。當您這樣做時,鏈接器將向系統提供載入 DLL 所需的信息,並在載入時解析導出的 DLL 函數的位置。
2、運行時動態鏈接
在運行時動態鏈接中,應用程序調用 LoadLibrary 函數或 LoadLibraryEx 函數以在運行時載入 DLL。成功載入 DLL 後,可以使用 GetProcAddress 函數獲得要調用的導出的 DLL 函數的地址。在使用運行時動態鏈接時,無需使用導入庫文件。
❺ 如果用c語言編寫dll文件,一般用哪些編譯器,或者說工具軟體來實現
dll是windows獨有的,所以非vc++6.0莫屬。
新建一個project:win32 dynamic link library
❻ VC++動態鏈接庫(DLL)編程深入淺出
4.2 聲明導出函數
DLL中導出函數的聲明有兩種方式:一種為4.1節例子中給出的在函數聲明中加上__declspec(dllexport),這里不再舉例說明;另外一種方式是採用模塊定義(。def) 文件聲明,。def文件為鏈接器提供了有關被鏈森亮亂接程序的導出、屬性及其他方面的信息。
下面的代碼演示了怎樣同。def文件將函數add聲明為DLL導出函數(需在dllTest工程中添加lib.def文件):
; lib.def : 導出DLL函數
LIBRARY dllTest
EXPORTS
add @ 1
.def文件的規則為:
(1)LIBRARY語句說明。def文件相應的DLL;
(2)EXPORTS語句後列出要導出函數的名稱。可以在。def文件中的導出函數名後加@n,表示要導出函數的序號為n(在進行函數調用時,這個序號將發揮其作用);
(3)。def 文件中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一行。
由此可以看出,例子中lib.def文件的含義為生成名為「dllTest」的動態鏈接庫,導出其中的add函數,並指定add函數的序號為1。
4.3 DLL的調用方式
在4.1節的例子中我們看到了由「LoadLibrary-GetProcAddress-FreeLibrary」系統Api提供的三位一體「DLL載入-DLL函數地址獲取-DLL釋放」方式,這種調用方式稱為DLL的動態調用。
動態調用方式的特點是完全由編程者用 API 函數載入和卸載 DLL,程序員可以決定 DLL 文件何時載入或不載入,顯式鏈接在運行時決定載入哪個 DLL 文件。
與動態調用方式相對應的就是靜態調用方式,「有動必有靜」,這來源於物質世界的對立統一。「動與靜此檔」,其對立與統一竟無數次在技術領域里得到驗證,譬如靜態IP與DHCP、靜態路由與動態路由等。從前文我們已經知道,庫也分為靜態庫與動態庫DLL,而想不到,深入到DLL內部,其調用方式也分為靜態與動態。「動與靜」,無處不在。《周易》已認識到有動必有靜的動靜平衡觀,《易。系辭》曰:「動靜有常,剛柔斷矣」。哲學意味著一種普遍的真理,因此,我們經常可以在枯燥的技術領域看到哲學的影子。
靜態調用方式的特點是由編譯系統完成對DLL的載入和應用程序結束時 DLL 的卸載。當調用某DLL的應用程序結束時,若系統中還有其它程序使用該 DLL,則Windows對DLL的應用記錄減1,直到所有使用該DLL的程序都結束時才釋放它。靜態調用方式簡單實用,但不如動態調用方式靈活。
下面我們來看看靜態調用的例子(單擊此處下載本工程附件),將編譯dllTest工程所生成的。lib和。dll文件拷入dllCall工程所在的路徑,dllCall執行下列代碼:
#pragma comment(lib,"dllTest.lib")
//.lib文件中僅僅是關於其對應DLL文件中函數的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d",result);
return 0;
}
由上述代碼可以看出,靜態調用方式的順利進行需要完成兩個動作:
(1)告訴編譯器與DLL相對應的。lib文件所在的路徑及文件名,#pragma comment(lib,"dllTest.lib")就是起這個作用。
程序員在建立一個DLL文件時,連接器會自動為其生成一個對應的。lib文件,該文件包含了DLL 導出函數的符號名及序號(並不含有實際的代碼)。在應用程序里,。lib文件將作為DLL的替代文件參與編譯。
(2)聲明導入函數,extern "C" __declspec(dllimport) add(int x,int y)語句中的__declspec(dllimport)發揮這個作用。
靜態調用方式不再需要使用鍵悄系統API來載入、卸載DLL以及獲取DLL中導出函數的地址。這是因為,當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中調用的與。lib文件中導出符號相匹配的函數符號將進入到生成的EXE 文件中,。lib文件中所包含的與之對應的DLL文件的文件名也被編譯器存儲在 EXE文件內部。當應用程序運行過程中需要載入DLL文件時,Windows將根據這些信息發現並載入DLL,然後通過符號名實現對DLL 函數的動態鏈接。這樣,EXE將能直接通過函數名調用DLL的輸出函數,就象調用程序內部的其他函數一樣。
4.4 DllMain函數
Windows在載入DLL的時候,需要一個入口函數,就如同控制台或DOS程序需要main函數、WIN32程序需要WinMain函數一樣。在前面的例子中,DLL並沒有提供DllMain函數,應用工程也能成功引用DLL,這是因為Windows在找不到DllMain的時候,系統會從其它運行庫中引入一個不做任何操作的預設DllMain函數版本,並不意味著DLL可以放棄DllMain函數。
根據編寫規范,Windows必須查找並執行DLL里的DllMain函數作為載入DLL的依據,它使得DLL得以保留在內存里。這個函數並不屬於導出函數,而是DLL的內部函數。這意味著不能直接在應用工程中引用DllMain函數,DllMain是自動被調用的。
我們來看一個DllMain函數的例子(單擊此處下載本工程附件)。
BOOL APIENTRY DllMain( HANDLE hMole,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("process attach of dll");
break;
case DLL_THREAD_ATTACH:
printf("thread attach of dll");
break;
case DLL_THREAD_DETACH:
printf("thread detach of dll");
break;
case DLL_PROCESS_DETACH:
printf("process detach of dll");
break;
}
return TRUE;
}
DllMain函數在DLL被載入和卸載時被調用,在單個線程啟動和終止時,DLLMain函數也被調用,ul_reason_for_call指明了被調用的原因。原因共有4種,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch語句列出。
來仔細解讀一下DllMain的函數頭BOOL APIENTRY DllMain( HANDLE hMole, WORD ul_reason_for_call, LPVOID lpReserved )。
APIENTRY被定義為__stdcall,它意味著這個函數以標准Pascal的方式進行調用,也就是WINAPI方式;
進程中的每個DLL模塊被全局唯一的32位元組的HINSTANCE句柄標識,只有在特定的進程內部有效,句柄代表了DLL模塊在進程虛擬空間中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,這兩種類型可以替換使用,這就是函數參數hMole的來歷。
執行下列代碼:
hDll = LoadLibrary("DebugdllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));
//MAKEINTRESOURCE直接使用導出文件中的序號
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("call add in dll:%d", result);
}
FreeLibrary(hDll);
}
我們看到輸出順序為:
process attach of dll
call add in dll:5
process detach of dll
這一輸出順序驗證了DllMain被調用的時機。
代碼中的GetProcAddress ( hDll, MAKEINTRESOURCE ( 1 ) )值得留意,它直接通過。def文件中為add函數指定的順序號訪問add函數,具體體現在MAKEINTRESOURCE ( 1 ),MAKEINTRESOURCE是一個通過序號獲取函數名的宏,定義為(節選自winuser.h):
#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
4.5 __stdcall約定
如果通過VC++編寫的DLL欲被其他語言編寫的程序調用,應將函數的調用方式聲明為__stdcall方式,WINAPI都採用這種方式,而C/C++預設的調用方式卻為__cdecl。__stdcall方式與__cdecl對函數名最終生成符號的方式不同。若採用C編譯方式(在C++中需將函數聲明為extern "C"),__stdcall調用約定在輸出函數名前面加下劃線,後面加「@」符號和參數的位元組數,形如_functionname@number;而__cdecl調用約定僅在輸出函數名前面加下劃線,形如_functionname。
Windows編程中常見的幾種函數類型聲明宏都是與__stdcall和__cdecl有關的(節選自windef.h):
#define CALLBACK __stdcall //這就是傳說中的回調函數
#define WINAPI __stdcall //這就是傳說中的WINAPI
#define WINAPIV __cdecl
#define APIENTRY WINAPI //DllMain的入口就在這里
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
在lib.h中,應這樣聲明add函數:
int __stdcall add(int x, int y);
在應用工程中函數指針類型應定義為:
typedef int(__stdcall *lpAddFun)(int, int);
若在lib.h中將函數聲明為__stdcall調用,而應用工程中仍使用typedef int (* lpAddFun)(int,int),運行時將發生錯誤(因為類型不匹配,在應用工程中仍然是預設的__cdecl調用),彈出如圖7所示的對話框。
圖7 調用約定不匹配時的運行錯誤
圖8中的那段話實際上已經給出了錯誤的原因,即「This is usually a result of」。
❼ mfc調用dll對話框問題
遇到這種情況,一般來說是你的導出函數名稱與你頭文件中的不一致,這是由於C++編譯器對導出函數進行了修飾,洞敗你嘗試著用extern "C" 前綴來導出,保證其函數蘆山名不被修飾。怎麼看導出函數?dll文件用Dependency walker,lib文件用mpbin,這兩個工具都是微軟的,其中mpbin是VS自帶的,在VC\Bin目錄中。當然,另外還可以用def文件來定義導出函數,這樣你陪顫中程序中的函數前就不需要加導出符了。
❽ dll文件用什麼軟體來編輯
dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
一、DLL文件常識
DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。DLL文件一般被存放在C:WindowsSystem目錄下
二、修改DLL文件的具體應用
在系統的組策略和注冊表中,我們可以修改一些鍵值來優化我們的系統洞亮,並加強操作系統的安全性。可是,對於限制下載、禁止刪除文件等功能,我們無法通過上述的操作來完成,這只有通過修改系統DLL文件來實現。目前,我們通過修改系統的DLL文件,可以實現禁止刪除文件、禁止IE下載、禁止IE另存為、禁止文件打開方式等功能。
三、系統中部分DLL文件的功能
1、Browselc.dll IE所需要調用的庫文件DLL結構雛形就是它了
2、Shdoclc.dll 系統窗口及設置等,如刪除文件、重命名
3、Shell32.dll 系統窗口及設置等,如刪除文件、重命名
4、Cryptui.dll IE控制項下載及提示對話框程序
四、修改DLL文件的方法納困寬
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
五、DLL文件修改秘籍
1、禁止下載的修改方法:打開Shdoclc.dll修改資源--對話框---4416,將4416鍵值禁用即可。
2、禁止網頁添加到收藏夾,打開Shdoclc.dll修改資源--對話框---21400,將該鍵值禁用即可。
3、禁止惡意網頁載入控制項,修改Cryptui.dll文件,要同時修改5個地方才能完全禁止 資源--對話框---130 資源--對話框---230 資源--對話框---4101 資源--對話框---4104 資源--對話框---4107 將以各對話框中的相應鍵值,修改成為禁用就可以了。
4、禁止系統刪除文件修改Shell32.dll,這個文件需要修改5個地方才可以禁止系統刪除文件。資源--對話框---1011 資源--對話框---1012 資源--對話框---1013 資源--對話框---1021 資源--對話框---1022 將以上五個地址的鍵值禁用就可以了!
5、禁止文件被改名,修改shell32.dll,有2個地方需要修改資源--對話框---1018 資源--對話框---1019 將以上兩處的相應鍵值,修改為禁用就可以了!
6、禁止運行菜單,修改shell32.dll,將資源--對話框---1018鍵值設尺差置為禁用。
7、禁止系統文件被挪動修改shell32.dll,需要修改4個地方 資源--對話框---1014 資源--對話框---1015 資源--對話框---1016 資源--對話框
8、禁止目標另存為,修改Shdoclc.dll文件,需要修改3個地方 資源--菜單--258---257 資源--菜單--258---252 資源--菜單--24641--2268 在這個修改中,我們要把各對應的鍵值刪除。打開該鍵值後,右鍵菜單中有刪除。在資源--菜單--24641—2268中,有多項該鍵值,請逐一刪除。
9、禁止自定義文件夾選項修改Shell32.dll文件,需要修改以下4個地方 資源--菜單--215---28719 資源--菜單--216---28719 資源--菜單--217---28719 資源--菜單--216---28719 找到以上四處鍵值,直接需要刪除後即可,而不是禁用。
10、禁止IE文件夾選項,修改Browselc.dll文件,需要修改3個鍵值 資源--菜單--263 (這里有多個請刪除)---41251(刪除) 資源--菜單--266(也有多個請刪除)---41329 (刪除) 資源--菜單--268---41251 (刪除) 在上面的3個鍵值中,個別鍵值有多處,請逐一刪除。
11、禁止98文件共享控制項,修改Msshrui.dll,需要修改2個地方 資源---對話框---- 1 --- AutoRadioButton 資源---對話框---- 30 --- AutoRadioButton 將以上兩處的鍵值禁用即可。其他的選項,可以根據自己的需要進行修改。找到相應的功能鍵值,將不需要的功能,禁用就可以了。
12、禁止文件的打開方式,修改Url.dll,需要修改2個地方 資源---對話框--- 7000 資源---對話框--- 7005 將以上兩處的鍵值禁用即可。
13、禁止更改系統桌面,修改Shdoc401.dll,有2處地方需要修改 資源---對話框--- 29952--- PushButton:瀏覽資源---對話框--- 29952--- PushButton:圖案 將以上兩處的鍵值禁用即可。
14、禁止系統文件夾自定義,修改Shd401lc.dll,有2處地方需要修改 資源---對話框--- 29957 資源---對話框--- 29958 將以上兩處的鍵值禁用即可。
15、禁止文件保存路徑及打開,修改Comdlg32.dll,有2處地方需要修改 資源---對話框--- 1547 資源---對話框--- 1548 將以上兩處的鍵值禁用即可。