您目前已離線,請等候您的網際網路重新連線

資訊: Windows Rundll 和 Rundll32 介面

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:164787
結論
Microsoft Windows 95、 Windows 98 和 Windows 千禧版 (Me) 包含兩個命令列公用程式具名 Rundll.exe 和 Rundll32.exe,可讓您叫用 (Invoke) 從 16 位元或 32 位元一個 DLL 匯出的函式。不過,Rundll 和 Rundll32 程式並不允許您從任何 DLL 呼叫任何匯出的函式。比方說您不可以使用這些公用程式呼叫 Win32 API (應用程式發展介面) 呼叫從系統 DLL 匯出。程式只可讓您明確地寫入由這些呼叫的 DLL 呼叫函式。本文提供的在上面所列之 Windows 作業系統下的 Rundll 和 Rundll32 程式使用的更多詳細資料。

Microsoft Windows NT 4.0]、 [Windows 2000] 和 [Windows XP 隨附只 Rundll32。沒有在任一個平台上支援的 Rundll (Win16 公用程式)。

僅供內部使用,在 Microsoft 原本設計 Rundll 和 Rundll32 公用程式。但它們所提供的功能是充分泛用它們是現在可供一般使用。 請注意 「 Windows NT 4.0 只隨附 Rundll32 公用程式支援僅 Rundll32。
其他相關資訊

Rundll vs.Rundll32

Rundll 載入並執行 16 位元 DLL,而 Rundll32 載入並執行 32 位元 DLL。如果您傳遞錯誤類型的 DLL Rundll 或 Rundll32,它可能無法執行但不表示任何錯誤訊息。

Rundll 命令列

Rundll 的命令列是,如下所示:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>				
範例是,如下所示:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
有 3 的問題,請仔細考慮上述的命令列:
  1. 在標準的地方 (請參閱 LoadLibrary() 函式,如需詳細資訊的文件) 指定的 DLL 檔案名稱的 Rundll 或 Rundll32 搜尋。建議您提供以確保找到正確的一個 DLL 的完整路徑。若要獲得最佳結果使用短檔案名稱來代替長檔案名稱以確保沒有不合法的字元會出現。特別是請注意這表示 「 C:\Program 檔案 」 資料夾中的 DLL 應該被轉換成簡短的名稱。
  2. <dllname>不能包含任何空格或逗點或引號。這是限制在 Rundll 命令列剖析器中。
  3. 在上述的命令列中逗號 (,) <dllname>和 <entrypont>函式名稱之間是非常重要。如果逗號分隔符號是遺失,Rundll 或 Rundll32 將會失敗而不表示任何錯誤。在還不能有任何 <dllname>並在逗號和 <entrypoint>函式之間的空白。

Rundll 的運作方式

Rundll 會執行下列步驟:
  1. 它會剖析命令列。
  2. 它會載入 LoadLibrary() 透過指定的 DLL。
  3. 它會取得透過 GetProcAddress() <entrypoint>函式的位址。
  4. 它會呼叫傳遞指令行尾線也就是 < 選擇性引數 > 在 <entrypoint>函式。
  5. <entrypoint>函式的傳回、 Rundll.exe 卸載 DLL 並結束。

如何撰寫您的 DLL

在您的 DLL 撰寫 <entrypoint>函式使用下列的原型:

16 位元 DLL:

  void FAR PASCAL __loadds  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
32 位元 DLL:
  void CALLBACK  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);				
再次,有 3 個進入點函式應該考量的問題:
  1. 很明顯地,名稱 「 進入點 」 應以進入點函式的實際名稱來取代。 請注意,Rundll32 的進入點是在 32 位元 DLL,哪些處理程序和執行緒連接/分離通知 DllEntryPoint 函式完全無關。
  2. 必須使用呼叫慣例 (回呼預設值為使用 _stdcall 屬性中) _stdcall 定義進入點函式的 Rundll32。如果 _stdcall 屬性遺失,然後函式預設為呼叫慣例的 _cdecl 而且然後 Rundll32 會終止異常之後呼叫函式。
  3. 因為您必須宣告函式與呼叫慣例,如以上所述的 _stdcall,它跟 Visual C++ 編譯器將實際上它匯出為 _EntryPoint@16 如果以 C 撰寫 DLL,或將進一步名稱裝飾如果使用以 C + + 撰寫 DLL。所以,請小心使用命令列中的正確匯出的名稱 Rundll 或 Rundll32。如果您想避免使用裝飾名稱,使用.def 檔,並依名稱匯出進入點函式。請使用 Visual C++ 編譯器時,參閱產品文件,並如進一步有關名稱裝飾下列的文件:
    140485匯出在 32 位元 DLL PASCAL 類似符號
Rundll 進入點參數如下:
   hwnd - window handle that should be used as the owner window for          any windows your DLL creates   hinst - your DLL's instance handle   lpszCmdLine - ASCIIZ command line your DLL should parse   nCmdShow - describes how your DLL's windows should be displayed				
在下列範例:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
Rundll 會 Setupx.dll 中呼叫 InstallHinfSection() 進入點函式並將它傳遞下列參數:
   hwnd = (parent window handle)   hinst = HINSTANCE of SETUPX.DLL   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"   nCmdShow = (whatever the nCmdShow was passed to CreateProcess)				
<entrypoint> 請注意它是 < 進入點 > 函式 (或在上述範例中 InstallHinfSection()),必須剖析它自己的命令列 (在上述的 lpszCmdLine 參數),並視需要使用個別的參數。 只有最多為選用的引數傳遞給它的命令列剖析 Rundll.exe。其餘的剖析是由 <entrypoint>函式。

特殊的備忘稿上 Windows 95 和 Windows NT 之間的差異

在 Windows NT、 Windows 2000 和 Windows XP Rundll32.exe 行為卻有些不同,以容納 UNICODE 指令行。

Windows NT 首先會嘗試 GetProcAddress <entrypoint>西部如果找到這個進入點原型會假定為:
   void CALLBACK   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,               int nCmdShow);				
這是 ANSI 進入點,一樣不同之處在於 lpszCmdLine 參數現在是 UNICODE 字串。

如果找不到 <EntryPoint>W 進入點,然後 Windows NT 將 GetProcAddress 為 <entrypoint>A 和 <entrypoint>。如果找到其中然後會被視為 ANSI 進入點並被視為與 Windows 95/98/Me.相同的方式因此,視您的 DLL 在 Windows 95 上執行具有 ANSI 支援和 Windows NT/2000年/XP 上具有 UNICODE 支援您應該匯出兩個函式: EntryPointW 和進入點。在 Windows NT/2000年/Me,UNICODE 命令列將會被呼叫 EntryPointW 函式 ; 在 Windows 95/98/Me,進入點函式會呼叫以 ANSI 命令列。
win95 工具

警告:本文為自動翻譯

內容

文章識別碼:164787 - 最後檢閱時間:11/21/2006 15:45:33 - 修訂: 4.4

Microsoft Win32 Application Programming Interface

  • kbmt kbdll kbfaq kbinfo kbkernbase kbprogramming kbusage KB164787 KbMtzh
意見反應
ent.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">