ShellExecute(Win32API)のパス解決機能?を使いたい

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

ShellExecute(Win32API)のパス解決機能?を使いたい

#1

投稿記事 by たろ » 12年前

お世話になっております。
Chrome,Firefoxなどブラウザを起動する機能をもつアプリを作っています。
Windowsの実行ファイルパス解決に関してよい方法を探しています。よろしくお願いいたします。

環境:WindowsXP SP3 Home, VC2008Express, C言語, Win32API

ブラウザを起動する機能は、
1. ブラウザのアイコンを持つボタンをクリックすると
2. そのブラウザ実行ファイルをCreateProcessまたはShellExecute関数で実行する
のですが、

ShellExecute関数は(なぜか) "chrome" という文字列のみからChromeが起動します。

コード:

ShellExecute( NULL, NULL, "chrome", NULL, NULL, SW_SHOWNORMAL );
おそらく内部で "chrome" という文字列から実行ファイルパス(exe/cmd/lnk等のファイルフルパス)を解決している
と思います。そのパス解決と同等の機能を使いたい(そしてアイコンを取得したい)のですが、実装方法がわかりません。

SearchPath関数は、環境変数PATHの中までは探してくれるようですが、"chrome" のみでは見つかりませんでした。

コード:

SearchPath( NULL, "notepad.exe", NULL, MAX_PATH, path, NULL ); // ◯
SearchPath( NULL, "chrome", NULL, MAX_PATH, path, NULL ); // ☓
他にそれらしい関数も見つけられませんでした・・。

ShellExecute関数はいったいどうやって実行ファイルを見つけ出しているのでしょうか。
その検索?解決?機能だけを使える関数があるとうれしいのですが、存在するでしょうか・・?

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

Re: ShellExecute(Win32API)のパス解決機能?を使いたい

#2

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

規定のプログラムなどから検索されているものと思われますが、次のようにするしかないようです。
「ShellExecuteで実行するEXEのパスを取得する - 止めどない青さの行き先」
http://blog.goo.ne.jp/blue_cave/e/dbe5f ... 45a4be2c0f
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: ShellExecute(Win32API)のパス解決機能?を使いたい

#3

投稿記事 by YuO » 12年前

ShellExecute(Ex)の検索順で検索して実行ファイルを返す API は見つからなかったのですが,一応情報を。

chromeで起動するのはApp Pathの機能です。
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
に登録されているプログラムは,Shell系APIではパス名なしで呼び出せます。
# コマンドプロンプト上で chrome は失敗するが, start chrome は成功します。

たろ

Re: ShellExecute(Win32API)のパス解決機能?を使いたい

#4

投稿記事 by たろ » 12年前

>softya(ソフト屋)さん

おおっこれは参考になりそうな実装例です!
レジストリから拡張子に関連付けされたコマンド?を取得する?コードに見えますが、
"chrome" でも大丈夫なのかな・・試してみたいと思います。ありがとうございました。

>YuOさん

なるほどApp Pathというものが・・!ありがとうございます。
レジストリを見たところ、とてもたくさんエントリがありました。
"chrome" は "chrome.exe" と決め打ちして参照すれば?フルパスを取得できそうです。

いずれにしてもこのあたりのレジストリを参照して自力実装する方向でしょうか。
いろいろ試してみたいと思います。ありがとうございました!

閉鎖

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