ShellExecuteの動作について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ママン

ShellExecuteの動作について

#1

投稿記事 by ママン » 12年前

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

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

コード:

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#2

投稿記事 by softya(ソフト屋) » 12年前

マルチバイト文字に設定されているなら、それで動くはずです。
そうですね。
エクスプローラのパスを入力する所にhttp://google.co.jpと入力してブラウザが開くか試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#3

投稿記事 by ママン » 12年前

さっそくのお返事ありがとうございます。
現在、設定は「マルチバイト文字」になっています。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#4

投稿記事 by softya(ソフト屋) » 12年前

ShellExecute関数ではなく、エクスプローラ・ウィンドウです。
フォルダ・ウィンドウでも構いません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#5

投稿記事 by ママン » 12年前

失礼しました。
フォルダ・ウィンドウから試しましたが、Win7、XPともにブラウザが立ち上がり、googleのHPが表示されました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#6

投稿記事 by softya(ソフト屋) » 12年前

そうですか。ブラウザオープンが動作するとなると残るのはウィルス対策ソフトあたりがガードしている可能性ぐらいでしょうか。
ウィルス対策ソフトのログを確認してみるのとテスト用にShellExecute関数だけのプログラムを書いて試してみてはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: ShellExecuteの動作について

#7

投稿記事 by ISLe » 12年前

効果があるか分かりませんが、"open"をNULLに変えてみてはどうでしょう。

ママン

Re: ShellExecuteの動作について

#8

投稿記事 by ママン » 12年前

皆さんありがとうございます。
しかし・・・・・・

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

ママン

Re: ShellExecuteの動作について

#9

投稿記事 by ママン » 12年前

今、下記のようにブラウザを指定する方法で試したところ、XPでも動作しました。

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#10

投稿記事 by softya(ソフト屋) » 12年前

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

※ SPやIEのバージョンによって変わるかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#11

投稿記事 by ママン » 12年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#12

投稿記事 by softya(ソフト屋) » 12年前

うーん。なんだろう。
とりあえず原点に戻って ShellExecuteの戻り値を調べてみましょう。
http://msdn.microsoft.com/ja-jp/library/cc422072.aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: ShellExecuteの動作について

#13

投稿記事 by ISLe » 12年前

ウチのXPでは質問に書いてあるコードでブラウザ(IE8)が開くのを確認したことを報告しておきます。

ママン

Re: ShellExecuteの動作について

#14

投稿記事 by ママン » 12年前

こんな遅い時間までお付き合いいただいていたとは・・・・・・
大変申し訳ございませんでした。
私が使っているXPもIE8が入っていますが、2台ともだめでした。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#15

投稿記事 by softya(ソフト屋) » 12年前

今回の問題はhtmlファイルの関連付けではなく、httpの関連付けの方ですね。
上で調べてもらったのでは、「HyperText転送プロトコル(HTTP)の関連づけ」ですよね?

あと5ってことはSE_ERR_ACCESSDENIEDですよね。
DirectPlayとの組み合わせでダメってのは見つけました。
ただ、ShellExecuteだけのプログラムでダメならDirectX(DXライブラリ)関係ないですしね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#16

投稿記事 by softya(ソフト屋) » 12年前

このプログラムを試してもらって良いですか。

コード:

#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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#17

投稿記事 by ママン » 12年前

ありがとうございます。
intだとエラーになるので、HINSTANCEに変更してさっそく試してみました。

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

コード:

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#18

投稿記事 by softya(ソフト屋) » 12年前

DirectXが絡むとダメなようですね。
あとはShellExecuteではなく、CreateProcessあたりを使ってexplorer.exeを起動してみるとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#19

投稿記事 by ママン » 12年前

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

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

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: ShellExecuteの動作について

#20

投稿記事 by ISLe » 12年前

explorer.exeでもIE固定になるような記述が見付かったのですが大丈夫でしょうか。

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

ママン

Re: ShellExecuteの動作について

#21

投稿記事 by ママン » 12年前

ええぇ~っ!
もう解決ボタン押してしまいました・・・・・・

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#22

投稿記事 by softya(ソフト屋) » 12年前

当方ではWin7ではFireFoxが呼び出されるのを確認してますが、XPはGoogleCromeなのでFireFoxでは確認していません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#23

投稿記事 by ママン » 12年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#24

投稿記事 by softya(ソフト屋) » 12年前

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

DXライブラリアプリ→HP起動アプリ→HP表示
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: ShellExecuteの動作について

#25

投稿記事 by ISLe » 12年前

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

ママン

Re: ShellExecuteの動作について

#26

投稿記事 by ママン » 12年前

返信が遅れ失礼しました。

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ShellExecuteの動作について

#27

投稿記事 by softya(ソフト屋) » 12年前

コンソールアプリではなく、DXライブラリと同じWinMainしてコンソールアプリみたいにShellexecuteだけすればウィンドウは出ませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ママン

Re: ShellExecuteの動作について

#28

投稿記事 by ママン » 12年前

できました!!!!!!!!!!!!
本当にありがとうございました!!!!!!!!!!

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

閉鎖

“C言語何でも質問掲示板” へ戻る