5/27 回答が連続投稿される不具合が発生しております

VC超初心者です。

Visual C++ 2005 Express EditionのWin32コンソールで作成しています。

ShellExecute()関数でIEを起動することはできたのですが、同じアプリで2回目に起動しようとすると、新規のIEブラウザが立ち上がってしまいます。これを既存IEウィンドウでリンク先だけ変更するには、どうすれば良いでしょうか?

アプリは、コマンドプロンプト上で「xxx.exe #####」と入力しENTERを押すと、「http://localhost/index.html?id=#####」というURLでIEを起動する、といった単純なものです。

アプリはそのまま終了してしまうのでMutexでは無理なのだと気づき、皆様のお知恵を拝借したいと思っております。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

そうですか ・・・ 当方で実験したところうまく動いたので投稿した次第ですが



FindWindowにて対象を見つけているのでしょうか?
見つかっていれば hwndがNULL以外の値を保持しています

ShellExecuteの第2引数は実行すべき操作なの『Open』が妥当だろうと思います
ここに URLを設定してしまうと Explorerに制御が行ってしまって新たにIEを起動してしまうように思います
第3引数はファイル名となっていますがIE対してURLを渡してやれば渡されたURLに遷移すると思いますよ
第3または第4引数辺りを使ってURLを渡すのが妥当なように思います
    • good
    • 0
この回答へのお礼

redfox63様
度々の御回答有難う御座います。

結論から申しますと、無事できました^^;
御指摘頂きました通り、ShellExecute()の使い方に問題があったようです。

上手く動作しなかったソースは、
 ShellExecute( hWnd, "Open", "IExplore",id_url , NULL, SW_SHOW);  // id_urlには、「http://..?id=###」という文字列がchar型配列で入っています。
上手く動作したソースは、
 ShellExecute( hWnd, "Open", id_url, NULL, NULL, SW_SHOW);
です。

第3引数に"IExplore"とプログラム名を記述した事で、新規にIEを起動するようになっていたようです。
ココを、URLに変更することで、起動済みのIEにURLを渡すことができました。

御記述頂いたソースではそうなっていたのですが、修正時にいつの間にか変更してしまいました・・・。

御教授頂きまして有難う御座いました。

お礼日時:2007/11/29 00:00

IEで表示でしょうか?


FindWindowでウィンドウハンドルを取得してからShellExecuteを実行してみてはいかがでしょう

HWND hWnd = FindWindow( NULL, _T("http://localhost/index.html - Microsoft Internet Explorer") );
if ( hWnd != NULL ) {
  TCHAR buf[256];
  _stprintf( buf, _T("http://localhost/index.html?id=%s"), argv[1] );
  ShellExecute( hWnd, _T("Open"), buf, NULL, NULL, SW_SHOW );
} else {
  ShellExecute( NULL, _T("Open"), _T("http://localhost/index.html"), NULL, NULL, SW_SHOW );
}

といった具合です ・・・

なお FindWindowの第2引数は 実情に合わせて修正してください
    • good
    • 0
この回答へのお礼

すみません、返事が遅くなりました。
なぜか会社からだと書き込めないという不具合・・・。

改めまして、ご回答頂きまして有難う御座います。

>IEで表示でしょうか?
はい、その通りです。
作成したアプリを実行することでIEを起動し、二回目のアプリ実行の時には一回目に起動したIEの中で表示する、といったことを目的としています。(説明下手ですみません・・・;;)

そこでまた質問なのですが、記載頂きましたソースで、
一回目の実行でelse分のShellExecute()でIEを起動し、二回目の実行でif文内のShellExecute()を実行するかと思います。

ShellExecute()の第1引数を、hWndとすることで既存のIEに表示するようになるのでしょうか?

現在、第2引数を可変のidに対応するよう修正していますが、二回目の実行でも新規のIEが起動してしまいます。

何か私の解釈が間違っていればご教授願います。

お礼日時:2007/11/27 23:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q起動済みのIEをハンドルから操作するには

既に起動済みのIEブラウザをWSH(VBS)などから、ハンドルを取得して
HTMLソース内のフォームに値をセット(Document forms elementなどで)
する事はできますでしょうか?
出来るとすれば、IEを捕まえて操作するには、どのようにすれば良い
でしょうか?

■補足
起動したIEは、自身のスクリプトからオブジェクトを生成したもの
では無く、ウインドウタイトルくらいしか解りません。

Aベストアンサー

とりあえず
Set ie = GetObject("", "InternetExplorer.Application")
Set ie = GetObject(, "InternetExplorer.Application")
のどちらかで取得できると思います。
Set ie = CreateObject("Shell.Application").Windows(0)
で取得する方法もあるらしいのですが、普通のフォルダもieとして認識してしまうため、純粋にieだけを取得する場合はチェックが必要だと思います。
取得したieでyahooで"おいしいラーメン"の検索結果の件数を表示します。
Sub sample()
Const READYSTATE_COMPLETE = 4
Dim ie As Object
Dim obj As Object
For Each obj In CreateObject("Shell.Application").Windows
If TypeName(obj.Document) = "HTMLDocument" Then
Set ie = obj
Exit For
End If
Next
If ie Is Nothing Then
MsgBox "ありません"
Exit Sub
End If
MsgBox "取得したieの情報" & vbCrLf & ie.LocationName & vbCrLf & ie.LocationURL & vbCrLf & TypeName(ie.Document)
ie.Navigate "www.yahoo.co.jp" 'yahooへ
Do While (ie.ReadyState <> READYSTATE_COMPLETE) Or ie.Busy: Loop '表示待ち
ie.Document.forms("sf1").elements("srchtxt").Value = "おいしいラーメン" '検索文字
ie.Document.forms("sf1").submit '検索
Do While (ie.ReadyState <> READYSTATE_COMPLETE) Or ie.Busy: Loop '表示待ち
If InStr(ie.Document.body.innertext, "に一致するウェブページは見つかりませんでした") > 0 Then
MsgBox "0件"
Else
MsgBox ie.Document.all("yschinfo").all(6).innertext & "件"
End If
Set ie = Nothing
End Sub

とりあえず
Set ie = GetObject("", "InternetExplorer.Application")
Set ie = GetObject(, "InternetExplorer.Application")
のどちらかで取得できると思います。
Set ie = CreateObject("Shell.Application").Windows(0)
で取得する方法もあるらしいのですが、普通のフォルダもieとして認識してしまうため、純粋にieだけを取得する場合はチェックが必要だと思います。
取得したieでyahooで"おいしいラーメン"の検索結果の件数を表示します。
Sub sample()
Const READYSTATE_COMPLETE = 4
Dim ie As Ob...続きを読む


人気Q&Aランキング

おすすめ情報