RUNDLL.EXEを使ったDLL呼び出しについて
Windowsフォルダには、RUNDLL.EXEという、そのまま起動しても何の効果もないアプリケーションが存在します。
これは、DLL,OCX,EXEなどのファイルから任意の関数を呼び出すアプリケーションのようで、
RUNDLL.EXEと、RUNDLL32.EXEの2つがあります。
どうやら、後者はRUNDLL.EXEの32Bit版のようですね。
このプログラムは、Windowsのシステムにとってとても重要なファイルなので、間違っても削除しちゃダメですよ(笑)
ウイルスではありませぬ。
(万が一RUNDLL.EXEがウイルス感染してしまった場合は別ですが・・・)
この記事では、RUNDLL.EXEを活用して、自作プログラムから、 あーんなことやこーんな事♥(←誇大表現ですw)を実現したり、
コマンドプロンプトからコントロールパネルや、Windows終了・再起動を呼び出すなどの、Windows上級者テクニックを使用するための方法をご紹介します。
・・・まぁ、前置きはこのくらいにして、実際にRUNDLL.EXEを使用してみましょう。
Windowsのコマンドプロンプトから実行する例:
rundll rnaui.dll,RnaDial
※Windows10の場合、rundll.exeが無いため、「rundll32」を使用します。
また、rnaui.dllは無いようですので、上記のコマンドはエラーとなります。
C言語や、Hot Soup Processorを使用して、自作のプログラムから呼び出す例:
exec("rundll rnaui.dll,RnaDial");
HSPの場合は、exec "〜"またはexec("〜")、C言語の場合は、exec("〜")やsystem("〜")、
PHPなら`〜`とかexec("〜")で呼び出せますので、それぞれの環境や言語に応じて、置き換えてください。
上記の例では、RUNDLL.EXE(rundll)からrnaui.dllを呼び出し、
その中のRnaDial関数を実行します。
この命令を実行すると、ネットワーク接続ダイアログが表示されるはずです。
このように、基本的には、「rundll ファイル名,関数名」 もしくは「rundll32 ファイル名,関数名」という感じで記述します。
当然ながら、プログラムからも呼び出せます。
ただし、rundll.exeおよびrundll32.exeは、引数を指定したり、戻り値を取得する関数には向きませんので、ご注意を。
資料
RUNDLL.EXE及び、RUNDLL32.EXEを使用した関数呼び出し例
下記は、HSP(Hot Soup Processor)から呼び出す場合の例です。
普通にWindowsのコマンドプロンプトから呼び出す場合は、exec("〜〜")の、〜〜の部分のみを使用して下さい。
ネットワーク接続ダイアログを表示
|
exec("rundll rnaui.dll,RnaDial")
|
ダイヤルアップネットワーク接続ウィザードを表示
|
exec("rundll32 rnaui.dll,RnaWizard")
|
プリンタの追加ウィザードを表示
|
exec("rundll32 shell32.dll,SHHelpShortcuts_RunDLL AddPrinter")
|
ファイルを開くアプリケーションの選択
|
exec("rundll shell32.dll,OpenAs_RunDLL c:¥¥windows¥¥notepad.exe")
(この例では、notepad.exeを開くアプリケーションを選択)
|
Windowsを終了
|
exec("rundll user,exitwindows")
|
Windowsを再起動
|
exec("rundll user,exitwindowsexec")
|
コントロールパネル関連
(「rundll shell32.dll,Control_RunDLL」を、「control」に置き換えても動作します。
例:exec("control appwiz.cpl"))
コントロールパネルのフォルダ
|
exec("rundll shell32.dll,Control_RunDLL")
|
アプリケーションの追加と削除のプロパティ
|
exec("rundll shell32.dll,Control_RunDLL appwiz.cpl")
|
画面のプロパティ
|
exec("rundll shell32.dll,Control_RunDLL desk.cpl")
|
インターネットのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL inetcpl.cpl")
|
地域のプロパティ
|
exec("rundll shell32.dll,Control_RunDLL intl.cpl")
|
ゲームオプション
|
exec("rundll shell32.dll,Control_RunDLL joy.cpl")
|
マウスのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL main.cpl @0")
|
キーボードのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL main.cpl @1")
|
プリンタのフォルダ
|
exec("rundll shell32.dll,Control_RunDLL main.cpl @2")
|
フォントのフォルダ
|
exec("rundll shell32.dll,Control_RunDLL main.cpl @3")
|
サウンドとマルチメディアのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL mmsys.cpl")
|
モデムのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL modem.cpl")
|
ネットワーク
|
exec("rundll shell32.dll,Control_RunDLL netcpl.cpl")
|
パスワードのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL password.cpl")
|
システムのプロパティ
|
exec("rundll shell32.dll,Control_RunDLL sysdm.cpl")
|
新しいハードウェアの追加ウィザード or ハードウェア
|
Windows10の場合 :
exec("rundll32 shell32.dll,Control_RunDLL sysdm.cpl,,2")
Windows10の場合は、ハードウェアのプロパティ画面が開きますが、
Windows9xの場合 :
exec("rundll shell32.dll,Control_RunDLL sysdm.cpl @1")
Windows 9xの場合、新しいハードウェアの追加ウィザードの画面があります。
|
ダイヤルのプロパティ
|
懐かしき、ダイヤルアップのプロパティです。もはや使われる事はないでしょう(笑)
Windows10の場合 :
exec("rundll32 shell32.dll,Control_RunDLL telephon.cpl")
Windows 9xの場合 :
exec("rundll shell32.dll,Control_RunDLL telephon.cpl")
|
日付と時刻のプロパティ
|
Windows10の場合 : exec("rundll32 shell32.dll,Control_RunDLL timedate.cpl")
※「rundll32 shell32.dll,Control_RunDLL timedate.cpl,,1」で、「追加の時計」になります。
Windows 9xの場合 : exec("rundll shell32.dll,Control_RunDLL timedate.cpl")
|
コントロールパネルの準備中?
|
exec("rundll shell32.dll,Control_FillCache_RunDLL")
※Windows10の場合、エントリーが無い旨のエラーとなるようです。
|
このように、一見重要と思われる、shell32.dllを、無理やり呼び出して、あんなことやこーんなことができます(笑)
この記事は、Windows9x時代の時に書かれたものなので、上記のコマンドが古い可能性があります。
随時アップデートしていきますので、しばしお待ちを(^^)
この記事の最終更新日 : 2017年10月30日
|