• 締切済み

実行ファイルの検索順の謎

前々から不思議に思っていたWindowsの素朴な疑問です。 コマンドプロンプトに実行ファイル名を入れると、カレントフォルダ検索後、PATH環境変数のフォルダを順に検索し、最初に見つかった実行ファイルが起動されます。 ところが、CreateProcess API に実行ファイル名を与えると、PATH環境変数で検索する前に Windows や System32 フォルダが検索されます。 時々これが現場で事故の原因になることがあるのですが、 何故こんな違いがあるのでしょうか? 理由をご存知の方がおられましたらよろしくお願いいたします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>時々これが現場で事故の原因になることがあるのですが、 蛇足 事故が想定されるならフルパス指定で実行するのが賢明

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

http://chokuto.ifdef.jp/urawaza/api/CreateProcess.html CreasteProcessAPI の プロセスの元ファイルの検索順序はPATH環境変数だけでは決まらないからです。

tknakamuri
質問者

補足

お察しかもしれませんが、実は java.exe の話です。 JDK のは JDKの bin へ JRE は system32 へインストールされるので コマンドプロンプト、ツールやサーバからの起動で結果が違うことが しばしば(JDK VM 固有のオプションが無いとか)。 PATHを変更して治らず悩む人が多いんです。

回答No.1

%PATH%には,通常C:\WindowsやC:\Windows\System32が含まれます。 で,これらを削除したコマンドプロンプトでnotepadと入力すると,notepad.exeは起動しません。 つまり,コマンドプロンプトではカレントディレクトリと%PATH%のみが認識されます。 # STARTを使うと,CreateProcessの順序になります。 CreateProcessの検索順序は以下に書いてあります。 MSDN: CreateProcess Function (Windows) http://msdn.microsoft.com/en-us/library/ms682425.aspx 優先順位1位はカレントディレクトリではなく, > The directory from which the application loaded. になります。 また,CMD.EXEの検索順序は,以下にあります。 TECHNET: Path http://technet.microsoft.com/ja-jp/library/cc753427.aspx ここには,Windowsディレクトリ等の話はまったく出てきません。 コマンドプロンプトから,CreateProcessの順序を使いたい場合は,STARTコマンドを使えばよいです。

tknakamuri
質問者

お礼

おお、start の話は知りませんでした。 有用な情報をありがとうございます。