ページ 11

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

Posted: 2013年1月15日(火) 10:48
by たろ
お世話になっております。
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関数はいったいどうやって実行ファイルを見つけ出しているのでしょうか。
その検索?解決?機能だけを使える関数があるとうれしいのですが、存在するでしょうか・・?

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

Posted: 2013年1月15日(火) 12:43
by softya(ソフト屋)
規定のプログラムなどから検索されているものと思われますが、次のようにするしかないようです。
「ShellExecuteで実行するEXEのパスを取得する - 止めどない青さの行き先」
http://blog.goo.ne.jp/blue_cave/e/dbe5f ... 45a4be2c0f

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

Posted: 2013年1月15日(火) 12:46
by YuO
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)のパス解決機能?を使いたい

Posted: 2013年1月15日(火) 14:01
by たろ
>softya(ソフト屋)さん

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

>YuOさん

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

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