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

文書翻訳 文書翻訳
文書番号: 164787 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

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++ コンパイラ使用時の装飾名に関する詳細については、製品マニュアルおよび次の資料を参照してください。
    140485 PASCAL に類似する記号を 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 の HINSTANCE
lpszCmdLine - "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 コマンド ラインで呼び出されます。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。

プロパティ

文書番号: 164787 - 最終更新日: 2014年1月30日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft Win32 Application Programming Interface?を以下の環境でお使いの場合
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
キーワード:?
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com