現在オフラインです。再接続するためにインターネットの接続を待っています

[INFO] Windows の Rundll と Rundll32 インターフェイス

概要
Microsoft Windows 95、Windows 98、および Windows Millennium Edition (Me) には、Rundll.exe および Rundll32.exe という名前の 2 つのコマンド ライン ユーティリティ プログラムが含まれています。これらのプログラムを使用して、16 ビットまたは 32 ビットの DLL からエクスポートされた関数を呼び出すことができます。ただし、Rundll プログラムおよび Rundll32 プログラムでは、すべての DLL からエクスポートしたすべての関数を呼び出すことができるわけではありません。たとえば、これらのユーティリティ プログラムを使用して、システム DLL からエクスポートした Win32 API (Application Programming Interface) 関数を呼び出すことはできません。これらのプログラムでは、これらのプログラムから呼び出すように明示的に記述されている DLL からのみ関数を呼び出すことができます。この資料では、上記のオペレーティング システムで Rundll プログラムおよび Rundll32 プログラムを使用する方法について詳しく説明します。

Microsoft Windows NT 4.0、Windows 2000、および Windows XP には、Rundll32 のみが含まれています。これらのプラットフォームでは、Rundll (Win16 ユーティリティ) はサポートされていません。

当初、Rundll ユーティリティ プログラムおよび Rundll32 ユーティリティ プログラムは、マイクロソフト社内でのみ使用することを目的に設計されました。しかし、これらのプログラムが提供する機能に汎用性があることから、一般にも使用されるようになりました。Windows NT 4.0 には、Rundll32 ユーティリティ プログラムのみが付属しており、Rundll32 のみがサポートされます。
詳細

Rundll と Rundll32

Rundll では 16 ビットの DLL がロードされて実行されますが、Rundll32 では 32 ビットの DLL がロードされて実行されます。Rundll または Rundll32 に適切な種類の DLL が渡されない場合、エラー メッセージが表示されることなく、プログラムの実行に失敗することがあります。

Rundll のコマンド ライン

Rundll のコマンド ラインは次のとおりです。
RUNDLL.EXE <dll 名>,<entrypoint> <オプションの引数>				
次に例を示します。
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
上記のコマンド ラインを実行する際には、次の 3 点に注意する必要があります。
  1. Rundll または Rundll32 では、指定の DLL のファイル名は標準的な場所で検索されます (詳細については、LoadLibrary() 関数のドキュメントを参照してください)。適切な DLL が検出されるように DLL の完全なパスを指定することをお勧めします。期待どおりの結果を得るには、長いファイル名ではなく、短いファイル名を使用して、無効な文字が含まれないようにします。特に、C:\Program Files フォルダーにある DLL は短い名前に変換する必要があります。
  2. <dll 名> には、スペース、コンマ、または引用符を含めることはできません。これは、Rundll コマンド ライン パーサーの制約によるものです。
  3. 上記のコマンド ラインでは、<dll 名> と <entrypont> 関数名の間にあるコンマ (,) が非常に重要です。このコンマがない場合、エラー メッセージが表示されることなく Rundll または Rundll32 の実行に失敗します。また、<dll 名>、コンマ、および <entrypoint> 関数の間に空白を含めることはできません。

Rundll の動作

Rundll では、以下の処理が実行されます。
  1. コマンド ラインを解析します。
  2. 指定された DLL を LoadLibrary() 経由で読み込みます。
  3. <entrypoint> 関数のアドレスを GetProcAddress() 経由で取得します。
  4. <entrypoint> 関数を呼び出して、コマンド ラインの最後に指定された <オプションの引数> を渡します。
  5. <entrypoint> 関数から制御が戻ると、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);				
ここでも、EntryPoint 関数について、次の 3 点に注意する必要があります。
  1. まず、"EntryPoint" を実際のエントリ ポイント関数名と置き換える必要があります。Rundll32 のエントリ ポイントは、プロセスとスレッドのアタッチまたはデタッチの通知を行う 32 ビット DLL の DllEntryPoint 関数と一切関連ありません。
  2. Rundll32 のエントリ ポイント関数は、_stdcall 呼び出し規約を使用して定義する必要があります (CALLBACK では既定で _stdcall 属性を使用します)。_stdcall 属性がない場合、エントリ ポイント関数では既定で _cdecl 呼び出し規約が使用され、Rundll32 は、この関数を呼び出した後に異常終了します。
  3. 既に説明したように、エントリ ポイント関数は _stdcall 呼び出し規約を使用して宣言する必要があるため、Visual C++ コンパイラでは、DLL が C で記述されている場合は DLL を _EntryPoint@16 としてエクスポートし、DLL が C++ で記述されている場合は装飾名が追加で使用されます。Rundll または Rundll32 のコマンド ラインでは、正しいエクスポート名を使用することが重要です。装飾名の使用を回避するには、.def ファイルを使用し、エントリ ポイント関数を名前でエクスポートします。Visual C++ コンパイラ使用時の装飾名に関する詳細については、製品マニュアルおよび次の資料を参照してください。
    140485PASCAL に類似する記号を 32 ビット DLL でエクスポートする
Rundll エントリ ポイントのパラメーターは、次のとおりです。
hwnd – DLL で作成する任意のウィンドウのオーナー ウィンドウとして使用するウィンドウ ハンドルhinst - DLL のインスタンス ハンドルlpszCmdLine - DLL で解析する ASCIIZ コマンド ラインnCmdShow - DLL のウィンドウを表示する方法を指定				
以下に例を示します。
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
上記の例では、Rundll は Setupx.dll の InstallHinfSection() エントリ ポイント関数を呼び出し、以下のパラメーターを渡します。
hwnd - 親ウィンドウ ハンドルhinst - SETUPX.DLL の HINSTANCElpszCmdLine - "132 C:\WINDOWS\INF\SHELL.INF"nCmdShow - nCmdShow によって CreateProcess に渡されたもの				
コマンド ライン (上記の例では lpszCmdLine パラメーター) を解析し、必要に応じて個別にパラメーターを使用するのは、<entrypoint> 関数 (上記の例では InstallHinfSection()) です。Rundll.exe によって解析されるのは、コマンド ラインで渡されたオプションの引数までです。それ以降の解析は、<entrypoint> 関数によって行われます。

Windows 95 と Windows NT の違いについて

Windows NT、Windows 2000、および Windows XP では、UNICODE コマンド ラインに対応するため、Rundll32.exe の動作が若干異なります。

Windows NT では、まず <EntryPoint>W に対して GetProcAddress が実行されます。このエントリ ポイントが検出された場合のプロトタイプは、次のようになることが想定されます。
   void CALLBACK   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,               int nCmdShow);				
これは lpszCmdLine パラメーターが UNICODE 文字列である点を除き、ANSI の EntryPoint 関数と同様です。

<EntryPoint>W エントリ ポイントが見つからない場合、Windows NT では <entrypoint>A および <entrypoint> に対して GetProcAddress が実行されます。これらのいずれかが見つかった場合、これらのエントリ ポイントは ANSI 用のエントリ ポイントと解釈され、Windows 95、Windows 98、および Windows Me では同様に処理されます。そのため、ANSI をサポートしている Windows 95、Windows 98、Windows Me および UNICODE をサポートしている Windows NT、Windows 2000、Windows XP で DLL を実行できるようにするには、EntryPointW と EntryPoint の 2 つの関数をエクスポートする必要があります。Windows NT、Windows 2000、および Windows Me では、EntryPointW は UNICODE コマンド ラインで呼び出されます。Windows 95、Windows 98、および Windows Me では、EntryPoint 関数は ANSI コマンド ラインで呼び出されます。
win95 tools
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:164787 - 最終更新日: 01/30/2014 11:11:00 - リビジョン: 1.0

Microsoft Win32 Application Programming Interface

  • kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787
フィードバック