::ShellExecute(NULL,_T(""),_T("http://www.google.co.jp/"),_T(""),_T(""),SW_SHOW);


Windows XP SP2で
httpプロトコルが Firefox 2.0.0.7 に関連付けられた環境にて上記のコードを実行すると、

・Firefoxが起動していない
・Firefox本体、または拡張機能のアップデートがある

の2つの条件を共に満たしている場合、
Firefoxが実行されるにも関わらず、戻り値がERROR_FILE_NOT_FOUNDとなります。
(上記の2つの条件を満たしていない場合の戻り値は32より大きい数値(成功)となります。)

ERROR_FILE_NOT_FOUNDは対象のファイルが存在しない時に返されるようですが、上記の条件との関連がわかりません。
なぜこのような事が起こるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/22 11:10:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント150pt

・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...
id:koori

こんなに詳しく調べて頂いて、ありがとうございます。

DDE の登録が無効になるというより、DDE サーバーとして機能しなくなる為のようです。

'実際の Firefox は、以下のように引数に URL を指定している為、DDE を使わなくても URL はオープンされる。

「ShellExecuteは失敗しているのに、なぜちゃんとFirefoxは起動しているだろう?」と疑問だったのですが、これで納得できました。

どうもありがとうございました!

2007/10/22 10:55:25

その他の回答1件)

id:cx20 No.1

回答回数607ベストアンサー獲得回数108ここでベストアンサー

ポイント150pt

・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...
id:koori

こんなに詳しく調べて頂いて、ありがとうございます。

DDE の登録が無効になるというより、DDE サーバーとして機能しなくなる為のようです。

'実際の Firefox は、以下のように引数に URL を指定している為、DDE を使わなくても URL はオープンされる。

「ShellExecuteは失敗しているのに、なぜちゃんとFirefoxは起動しているだろう?」と疑問だったのですが、これで納得できました。

どうもありがとうございました!

2007/10/22 10:55:25
id:karate_kid001 No.2

回答回数93ベストアンサー獲得回数2

id:koori

え~と・・・・。

これは、どう関係しているのでしょう?

2007/10/22 10:59:33
  • id:cx20
    補足です。

    > この為、ShellExecute() は、1つめの Firefox.exe の呼び出しが失敗したと判断され、
    > ERROR_FILE_NOT_FOUND となってしまうのではないでしょうか。

    試しに、ブラウザもどき(引数で渡された URL の内容を表示するプログラム)を作って、
    以下のレジストリの設定(http の関連付け)を変更し、
    [スタート] - [ファイル名を指定して実行] で「http://www.google.co.jp/」を実行したところ、
    以下のようなエラーが表示されることが確認できました。

    HKEY_CLASSES_ROOT\http\shell\open\command
    C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1"
         ↓
    C:\home\edu\vs2005\vc\mfc\MfcAppArgTest\release\MfcAppArgTest.exe %1

    ---------------------------
    http://www.google.co.jp/
    ---------------------------
    [X] 'http://www.google.co.jp/' が見つかりません。
      名前を正しく入力したかどうかを確認してから、やり直してください。
      ファイルを検索するには、 [スタート] ボタンをクリックしてから、[検索] をクリックしてください。
    ---------------------------
         [ OK ]
    ---------------------------

    ERROR_FILE_NOT_FOUND の意味としては、このような事象を表しているのでは?と思います。
    (このとき「ブラウザもどき」は、正しく Web ページは表示できています。)

    また、再度、Firefox 2.0.0.7 → 2.0.0.8 更新状態を作って、
    [スタート] - [ファイル名を指定して実行] で「http://www.google.co.jp/」を実行したところ、
    先ほどと同様に「'http://www.google.co.jp/' が見つかりません。」となりました。
    (このとき Web ページは表示されず、かわりに「Update.exe」が呼び出されるようです。)

    なぜ、このようなエラーが表示されるのかはわかりません。

    想像ですが、既定のブラウザとして起動させるには、アプリケーションを決められた手順で初期化する必要があるのかもしれません。
    Firefox 更新時は、一時的に、通常のアプリケーションの初期化処理とは異なる動作をする為に、エラーになっているのでは?と思います。
  • id:cx20
    > なぜ、このようなエラーが表示されるのかはわかりません。

    DDE の登録(レジストリの設定?)に問題がある場合に「XXXX が見つかりません。」のメッセージが表示されるようです。

    > 想像ですが、既定のブラウザとして起動させるには、アプリケーションを決められた手順で初期化する必要があるのかもしれません。
    > Firefox 更新時は、一時的に、通常のアプリケーションの初期化処理とは異なる動作をする為に、エラーになっているのでは?と思います。


    アプリケーションの初期化処理というより、アプリケーション更新時に、一時的に DDE の登録が無効となる為、このような事象が発生するのでは?と思います。

    自分が DDE について詳しく理解できていない為、説明が間違っていたらすみません。

    <ブラウザと DDE に関する情報>
    ■ Netscape mozilla DDE資料 - しいしせねっと
    http://siisise.net/dde.html
    ■ Firefoxでショートカット クリック時のエラー対処法 - IT+
    http://www.masahiko.info/it/archives/000900.html
    ■ [OLEXP] 電子メール メッセージ内のリンクを新しいブラウザ ウィンドウで開くように Outlook Express を構成する方法
    http://support.microsoft.com/kb/256953/ja
  • id:cx20
    度々すみません。

    > 自分が DDE について詳しく理解できていない為、説明が間違っていたらすみません。

    DDE の説明に誤りがありました。

    > DDE の登録(レジストリの設定?)に問題がある場合に「XXXX が見つかりません。」
    > のメッセージが表示されるようです。

    ログを確認してみましたが、Firefox 更新時の DDE に関するレジストリの変更は
    行われていないようです。

    > アプリケーションの初期化処理というより、アプリケーション更新時に、
    > 一時的に DDE の登録が無効となる為、このような事象が発生するのでは?と思います。

    DDE の登録が無効になるというより、DDE サーバーとして機能しなくなる為のようです。

    通常の処理としては、Firefox 起動時に DDE サーバーとして起動し、DDE チャネルを介して、
    Web サイトのオープン(WWW_OpenURL 用のチャネルに対して DDE コマンドの発行)を行うようです。

    この為、DDE サーバーとして機能していない状態(Firefox 更新時)に、
    DDE コマンドの発行(Web サイトのオープン)を行おうとすると、

    > 'http://www.google.co.jp/' が見つかりません。

    のようなメッセージがでるのでは?と思います。

    以下は、DDE を使用した通信サンプルです。

    ' <Excel VBA>
    ' 1. Excel より [ツール] - [マクロ] - [Visual Basic Editor] を起動
    ' 2. Visual Basic Editor にて [挿入] - [標準モジュール] を選択
    ' 3. 以下のコードを挿入
    ' 4. FirefoxDdeTest() プロシージャを実行
    ' 5. Firefox にて http://www.google.co.jp/ がオープンされることを確認。
    Option Explicit

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    Sub FirefoxDdeTest()
      Dim ddeChannel As Long
      Dim strDDECommand As String
      Dim strFirefoxPath As String
      Dim strURL As String
      
      '対象URL
      strURL = "http://www.google.co.jp/"
      
      'Firefox のパス
      strFirefoxPath = "C:\PROGRA~1\MOZILL~1\Firefox.EXE"
      '実際の Firefox は、以下のように引数に URL を指定している為、DDE を使わなくても URL はオープンされる。
      'strFirefoxPath = "C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url ""%1"""
      'strFirefoxPath = Replace(strFirefoxPath, "%1", strURL)

      'FireFox 起動
      Shell strFirefoxPath, 1
      Sleep 1000 ' Shell 関数は起動が完了するまで待機しない為、とりあえず 1000ms 待機
      
      'DDE チャネル初期化
      ddeChannel = DDEInitiate("Firefox", "WWW_OpenURL")
      
      'DDE コマンド実行(URLオープン)
      strDDECommand = """%1"",,0,0,,,,"
      strDDECommand = Replace(strDDECommand, "%1", strURL)
      DDEExecute ddeChannel, strDDECommand
      
      'DDE チャネル切断
      DDETerminate ddeChannel
      
    End Sub

    以下は、正常動作時の DDE 処理のログ(Visual Studio 付属の DDE Spy を使ったログ)です。

    <Firefox 起動(サーバー起動)>
    [Server] Task:0x270, Time:31115641, String Handle Created: c000(Firefox)
    [Server] Task:0x270, Time:31115641, String Handle Created: c001(WWW_OpenURL)
    [Server] Task:0x270, Time:31115651, String Handle Created: c002(WWW_Activate)
    [Server] Task:0x270, Time:31115651, String Handle Created: c003(WWW_CancelProgress)
    [Server] Task:0x270, Time:31115651, String Handle Created: c004(WWW_Version)
    [Server] Task:0x270, Time:31115661, String Handle Created: c005(WWW_RegisterViewer)
    [Server] Task:0x270, Time:31115661, String Handle Created: c006(WWW_UnRegisterViewer)
    [Server] Task:0x270, Time:31115661, String Handle Created: c007(WWW_GetWindowInfo)

    [Server] Task:0x270 Time:31116633 Callback:
      Type=Register, fmt=0x0("?"), hConv=0x0, hsz1=0xc000("Firefox")
      hsz2=0x1c001("Firefox(0X001103B4)"), hData=0x0, dwData1=0x0, dwData2=0x0
      return=0x0

    <DDE 初期化処理(WWW_OpenURL 用のチャネル作成)>
    [Client] Task:0x634 Time:31120288 hwndTo=0x1103b4 Message(Sent)=Initiate:
      hwndFrom=0x1502e4, App=0xc075("Firefox")
      Topic=0xc064("WWW_OpenURL")

    [Server] Task:0x270 Time:31120298 Callback:
      Type=Connect, fmt=0x0("?"), hConv=0x0, hsz1=0xc001("WWW_OpenURL")
      hsz2=0xc000("Firefox"), hData=0x0, dwData1=0x0, dwData2=0x0
      return=0x1

    [Server] Task:0x270 Time:31120298 hwndTo=0x1502e4 Message(Sent)=Ack:
      hwndFrom=0x3303ca, App=0xc075("Firefox")status=c075(fAck fBusy )
      Topic=Item=0xc064("WWW_OpenURL")

    [Server] Task:0x270 Time:31120308 Callback:
      Type=Connect_confirm, fmt=0x0("?"), hConv=0x2000500, hsz1=0xc000("WWW_OpenURL")
      hsz2=0xc001("Firefox"), hData=0x0, dwData1=0x0, dwData2=0x0
      return=0x0

    <DDE コマンド実行 [Client] -> [Server]>
    [Client] Task:0x634 Time:31121560 hwndTo=0x3303ca Message(Posted)=Execute:
      hwndFrom=0x1502e4,
      Execute command=""http://www.goo"

    <DDE コマンド実行 [Server]>
    [Server] Task:0x270 Time:31121560 Callback:
      Type=Execute, fmt=0x0("?"), hConv=0x2000500, hsz1=0xc000("WWW_OpenURL")
      hsz2=0x0(""), hData=0x3000b00, dwData1=0x0, dwData2=0x0
      return=0x8000
      Input data=
      22 68 74 74 70 3a 2f 2f 77 77 77 2e 67 6f 6f 67 "http://www.goog
      6c 65 2e 63 6f 2e 6a 70 2f 22 2c 2c 30 2c 30 2c le.co.jp/",,0,0,
      ...
    [Server] Task:0x270 Time:31121570 hwndTo=0x1502e4 Message(Posted)=Ack:
      hwndFrom=0x3303ca, App=0x8000("#32768")status=8000(fAck )
      Topic=Item=0xe80044("#68")

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません