ページ 11

ShellExecuteの動作について

Posted: 2013年3月24日(日) 14:02
by ママン
はじめまして。
今、私はゲームソフトを作っており、その中で自分のサイトにアクセスできるボタンを作っています。
ブラウザを開くのにShellExecute関数を使っているのですが、環境によって動いたり動かなかったりするので困っています。

以下はボタンを押した後に処理されるソースコードです。

コード:

ShellExecute(NULL, "open", "http://google.co.jp", NULL, NULL, SW_SHOWNORMAL) ;
開発環境 : Windows7 + VC++2010 + DXライブラリ

リリースで出来たexeファイルをWindows7で実行すると普通に動きますが、WindowsXPに持っていくと動きません。
XPで正常に動かないのはこの部分だけなので、正直何が問題なのかよくわかりません。

こういった現象についてご存知の方がいらっしゃれば、宜しくお願いします。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 15:11
by softya(ソフト屋)
マルチバイト文字に設定されているなら、それで動くはずです。
そうですね。
エクスプローラのパスを入力する所にhttp://google.co.jpと入力してブラウザが開くか試してみてください。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 15:42
by ママン
さっそくのお返事ありがとうございます。
現在、設定は「マルチバイト文字」になっています。

>エクスプローラのパスを入力する所にhttp://google.co.jpと入力してブラウザが開くか試してみてください。
これはShellExecute関数の第3引数をという意味でよいでしょうか。
この場合でも、Windows7では動きますが、XPだとブラウザすら立ち上がりません。

私のゲームでは他にもhtmlで書かれたヘルプを立ち上げるのに同関数を用いていますが、そちらは相対パスを
よんでブラウザ上できちんと表示されています。
webアドレスを書いたところだけ動かないので、とても不思議な思いです。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 15:48
by softya(ソフト屋)
ShellExecute関数ではなく、エクスプローラ・ウィンドウです。
フォルダ・ウィンドウでも構いません。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 16:09
by ママン
失礼しました。
フォルダ・ウィンドウから試しましたが、Win7、XPともにブラウザが立ち上がり、googleのHPが表示されました。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 16:14
by softya(ソフト屋)
そうですか。ブラウザオープンが動作するとなると残るのはウィルス対策ソフトあたりがガードしている可能性ぐらいでしょうか。
ウィルス対策ソフトのログを確認してみるのとテスト用にShellExecute関数だけのプログラムを書いて試してみてはどうでしょうか?

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 18:32
by ISLe
効果があるか分かりませんが、"open"をNULLに変えてみてはどうでしょう。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 19:01
by ママン
皆さんありがとうございます。
しかし・・・・・・

1) ウィルス対策ソフトを停止してみましたが効果はありませんでした。
2) ShellExecute関数だけのプログラムを書いてみましたが、これもXPでは駄目でした。
3) "open"をNULLに変えてもXPでは駄目でした。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 19:13
by ママン
今、下記のようにブラウザを指定する方法で試したところ、XPでも動作しました。

コード:

HWND hWnd = GetMainWindowHandle() ;
ShellExecute(hWnd, "open", "IExplore", "http://google.co.jp/", NULL, SW_SHOWNORMAL) ;
しかし、これだとIE限定になってしまうので、できれば使いたくないです。
他に何かよい方法はないでしょうか。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 19:24
by softya(ソフト屋)
XPで関連付けがどうなっているか確認してください。
「HyperText転送プロトコル(HTTP)の関連づけ」
http://www.ktlink.jp/hlp/TechInfoExplorerHttp.htm
上の説明どおり関連づけを行うのではなく確認だけお願いします。
デフォルトでopenのアクションが設定されているはずなのですが。

※ SPやIEのバージョンによって変わるかもしれません。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 19:33
by ママン
XP(SP3)の方では「open」が設定されており、詳細を開くとアクションを実行するプログラムにIEが指定されていました。

Re: ShellExecuteの動作について

Posted: 2013年3月24日(日) 22:23
by softya(ソフト屋)
うーん。なんだろう。
とりあえず原点に戻って ShellExecuteの戻り値を調べてみましょう。
http://msdn.microsoft.com/ja-jp/library/cc422072.aspx

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 00:58
by ISLe
ウチのXPでは質問に書いてあるコードでブラウザ(IE8)が開くのを確認したことを報告しておきます。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 09:26
by ママン
こんな遅い時間までお付き合いいただいていたとは・・・・・・
大変申し訳ございませんでした。
私が使っているXPもIE8が入っていますが、2台ともだめでした。

また、先ほどShellExecuteの戻り値を確認してみました。
数値は「5」となっていました。
とりあえずググッたところでは「ファイルアクセスエラー」に相当するようです・・・・・・。

しかし、ヘルプ用に作成したhtmlファイルのアイコンはIEのものになっていますし、関連付けはなっているはずです。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 10:56
by softya(ソフト屋)
今回の問題はhtmlファイルの関連付けではなく、httpの関連付けの方ですね。
上で調べてもらったのでは、「HyperText転送プロトコル(HTTP)の関連づけ」ですよね?

あと5ってことはSE_ERR_ACCESSDENIEDですよね。
DirectPlayとの組み合わせでダメってのは見つけました。
ただ、ShellExecuteだけのプログラムでダメならDirectX(DXライブラリ)関係ないですしね。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 11:15
by softya(ソフト屋)
このプログラムを試してもらって良いですか。

コード:

#include <stdio.h>
#include <windows.h>
 
#pragma comment(lib, "shell32.lib" )
 
int main(void)
{
	int ret = ShellExecute(NULL, NULL, "explorer.exe", "http://google.co.jp/", NULL, SW_SHOWNORMAL) ;
	printf( "ShellExecute=%d\n",ret );
    return 0;
}

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 11:58
by ママン
ありがとうございます。
intだとエラーになるので、HINSTANCEに変更してさっそく試してみました。

・・・動かないので、最後の手段と思い、ランタイム(msvcr100.dll)を再インストールしてみたら動きました。
私が最初に記載したコード

コード:

ShellExecute(NULL, "open", "http://google.co.jp", NULL, NULL, SW_SHOWNORMAL) ;
も動きました。

もしかしてと思い、ゲーム本体を起動してみたら・・・・・・やはり動きません。

試しにDXライブラリをインクルードし、上のコードを動かそうとしたところ、エラー5になりました。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 12:08
by softya(ソフト屋)
DirectXが絡むとダメなようですね。
あとはShellExecuteではなく、CreateProcessあたりを使ってexplorer.exeを起動してみるとか。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 12:30
by ママン
申し訳ございません。
ゲーム本体のShellExecuteの引数をソフト屋様にいただいたコードに書き換えたところ動きました。
DirectXが絡むと「open」が使えない理由はよくわかりませんが、とりあえず動いているのを見て感動しました。

ご助言いただいた皆様、とくにソフト屋様に感謝いたします。
大変ありがとうございました!

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 16:24
by ISLe
explorer.exeでもIE固定になるような記述が見付かったのですが大丈夫でしょうか。

ShellExecuteでブラウザを起動するだけの実行ファイルを作っておいてそれをShellExecuteするという方法があるみたいです。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 18:34
by ママン
ええぇ~っ!
もう解決ボタン押してしまいました・・・・・・

私の持っているPCはIEしか入っていないので、他のブラウザはまだ確認していません。

>ShellExecuteでブラウザを起動するだけの実行ファイルを作っておいてそれをShellExecuteする
これは面白そうですね。
もしよろしければ情報元を教えていただけないでしょうか。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 19:06
by softya(ソフト屋)
当方ではWin7ではFireFoxが呼び出されるのを確認してますが、XPはGoogleCromeなのでFireFoxでは確認していません。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 19:44
by ママン
XPにファイアーフォックスをインストールし、規定のブラウザに設定後試してみました。
(HyperText転送プロトコル(HTTP)の関連づけはファイアーフォックスになっています)

その結果、何故かIEが立ち上がりました・・・・・・。

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 20:47
by softya(ソフト屋)
ISleさんの方法は、2段ロケットですね。そっちなら確実かも。
ShellExecute(NULL, "open", "http://google.co.jp", NULL, NULL, SW_SHOWNORMAL) ;だけのプログラムを作って、それをDXライブラリを使ったプログラムからShellExecuteすると言う方法です。

DXライブラリアプリ→HP起動アプリ→HP表示

Re: ShellExecuteの動作について

Posted: 2013年3月25日(月) 23:20
by ISLe
ママン さんが書きました:>ShellExecuteでブラウザを起動するだけの実行ファイルを作っておいてそれをShellExecuteする
これは面白そうですね。
もしよろしければ情報元を教えていただけないでしょうか。
SE_ERR_ACCESSDENIEDで検索したら、呼び出せないショートカットの代わりにバッチファイルを作って間接的に呼び出したらできたという記述を見付けました。
なのでブラウザの呼び出しにも使えるのではないかと。

Re: ShellExecuteの動作について

Posted: 2013年3月26日(火) 11:12
by ママン
返信が遅れ失礼しました。

外部exeファイルを呼び出してShellexecuteを実行したところ、
XPでもファイアーフォックスで目的のページが表示されました。

ただ、外部exeファイルを実行した時に、画面に黒い窓が一瞬現れて消えるので、
人によっては嫌われるかもしれないと思いました。
(ユーザーの情報を勝手に私のサイトに送っていると勘違いされるかもしれないという意味です)。

私はShellexecuteしか使ったことがないので、こだわってきましたが、実際これを使うのは無理かもしれません。

Re: ShellExecuteの動作について

Posted: 2013年3月26日(火) 11:15
by softya(ソフト屋)
コンソールアプリではなく、DXライブラリと同じWinMainしてコンソールアプリみたいにShellexecuteだけすればウィンドウは出ませんよ。

Re: ShellExecuteの動作について

Posted: 2013年3月26日(火) 11:41
by ママン
できました!!!!!!!!!!!!
本当にありがとうございました!!!!!!!!!!

今日は興奮して眠れないかもしれません(笑)