Windows XP SP2で
httpプロトコルが Firefox 2.0.0.7 に関連付けられた環境にて上記のコードを実行すると、
・Firefoxが起動していない
・Firefox本体、または拡張機能のアップデートがある
の2つの条件を共に満たしている場合、
Firefoxが実行されるにも関わらず、戻り値がERROR_FILE_NOT_FOUNDとなります。
(上記の2つの条件を満たしていない場合の戻り値は32より大きい数値(成功)となります。)
ERROR_FILE_NOT_FOUNDは対象のファイルが存在しない時に返されるようですが、上記の条件との関連がわかりません。
なぜこのような事が起こるのでしょうか?
・Firefoxが起動していない
・Firefox本体、または拡張機能のアップデートがある
の2つの条件を共に満たしている場合、
Firefoxが実行されるにも関わらず、戻り値がERROR_FILE_NOT_FOUNDとなります。
環境(Firefox 2.0.0.7 → 2.0.0.8 更新状態)を作って試してみました。
確かに、Firefox の更新を行った状態(次回起動時にインストールの状態)
---------------------------------- ソフトウェアの更新 [X] ---------------------------------- [!] 更新は Firefox の次回起動時にインストールされます。 [ OK ] ----------------------------------
で、ShellExecute() による呼び出しを行うと ERROR_FILE_NOT_FOUND となるようです。
Firefox の更新処理の仕組みを、Process Monitor というツールで調べてみたところ、以下のような動作をしているようです。
<Firefox Update 時の処理> [1656] Test.exe (ShellExecute() 呼び出し) ↓ HKCR\http\shell\open\command\(Default) Data:C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" ↓ [2252] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/" → Updater.exe 起動後、PID:2252 の Firefox.exe は終了 ↓ [2236] Updater.exe "<%USERPROFILE%>\Local Settings\Application Data\Mozilla\Firefox\Mozilla Firefox\updates\0" "2252" "<Current Dir>" "C:\PROGRA~1\MOZILL~1\FIREFOX.EXE" "-requestPending" "-osint" "-url" "http://www.google.co.jp/" ↓ [3628] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/"
と、なっているようです。
以下は、通常の、Firefox での呼び出し処理です。
<Firefox 通常起動時の処理> [1656] Test.exe (ShellExecute() 呼び出し) ↓ HKCR\http\shell\open\command\(Default) Data:C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" ↓ [3144] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/"
このように、Firefox 更新時は、ダイレクトに Firefox.exe で Web ページが表示されるのではなく、
一旦、終了し、Update.exe を呼び出し、再度、Firefox.exe を呼び出すような動作をしているようです。
この為、ShellExecute() は、1つめの Firefox.exe の呼び出しが失敗したと判断され、
ERROR_FILE_NOT_FOUND となってしまうのではないでしょうか。
<使用ツール> ■ Process Monitor v1.25 http://www.microsoft.com/technet/sysinternals/utilities/processm...
・Firefoxが起動していない
・Firefox本体、または拡張機能のアップデートがある
の2つの条件を共に満たしている場合、
Firefoxが実行されるにも関わらず、戻り値がERROR_FILE_NOT_FOUNDとなります。
環境(Firefox 2.0.0.7 → 2.0.0.8 更新状態)を作って試してみました。
確かに、Firefox の更新を行った状態(次回起動時にインストールの状態)
---------------------------------- ソフトウェアの更新 [X] ---------------------------------- [!] 更新は Firefox の次回起動時にインストールされます。 [ OK ] ----------------------------------
で、ShellExecute() による呼び出しを行うと ERROR_FILE_NOT_FOUND となるようです。
Firefox の更新処理の仕組みを、Process Monitor というツールで調べてみたところ、以下のような動作をしているようです。
<Firefox Update 時の処理> [1656] Test.exe (ShellExecute() 呼び出し) ↓ HKCR\http\shell\open\command\(Default) Data:C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" ↓ [2252] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/" → Updater.exe 起動後、PID:2252 の Firefox.exe は終了 ↓ [2236] Updater.exe "<%USERPROFILE%>\Local Settings\Application Data\Mozilla\Firefox\Mozilla Firefox\updates\0" "2252" "<Current Dir>" "C:\PROGRA~1\MOZILL~1\FIREFOX.EXE" "-requestPending" "-osint" "-url" "http://www.google.co.jp/" ↓ [3628] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/"
と、なっているようです。
以下は、通常の、Firefox での呼び出し処理です。
<Firefox 通常起動時の処理> [1656] Test.exe (ShellExecute() 呼び出し) ↓ HKCR\http\shell\open\command\(Default) Data:C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" ↓ [3144] Firefox.exe -requestPending -osint -url "http://www.google.co.jp/"
このように、Firefox 更新時は、ダイレクトに Firefox.exe で Web ページが表示されるのではなく、
一旦、終了し、Update.exe を呼び出し、再度、Firefox.exe を呼び出すような動作をしているようです。
この為、ShellExecute() は、1つめの Firefox.exe の呼び出しが失敗したと判断され、
ERROR_FILE_NOT_FOUND となってしまうのではないでしょうか。
<使用ツール> ■ Process Monitor v1.25 http://www.microsoft.com/technet/sysinternals/utilities/processm...
こんなに詳しく調べて頂いて、ありがとうございます。
DDE の登録が無効になるというより、DDE サーバーとして機能しなくなる為のようです。
'実際の Firefox は、以下のように引数に URL を指定している為、DDE を使わなくても URL はオープンされる。
「ShellExecuteは失敗しているのに、なぜちゃんとFirefoxは起動しているだろう?」と疑問だったのですが、これで納得できました。
どうもありがとうございました!
え~と・・・・。
これは、どう関係しているのでしょう?
こんなに詳しく調べて頂いて、ありがとうございます。
「ShellExecuteは失敗しているのに、なぜちゃんとFirefoxは起動しているだろう?」と疑問だったのですが、これで納得できました。
どうもありがとうございました!