MFCを使ったダイアログでプログラムを作っているのですが、現在
char cDentakumsg[256];
strcpy(cDentakumsg, C:\\WINDOWS\\Calc.exe);
ShellExecute(NULL, open, cDentakumsg, NULL, NULL, SW_SHOWNORMAL);
このような形でアプリケーションを起動しているのですが、
ファイルのフルパスを自分で検索してアプリケーションを起動させる方法は無いですか?
今のままでは
直接指定のためPCに依存してしまうので、汎用性を持たせたいのです。
上のプログラムで言う「Calc.exe」これがどこに入っているか検索して
起動させたいのです。初心者ですがご指導の方お願いします。
exe名で探すということですか?
FindFirstFileで全ディレクトリを探すだけだと思いますけど。
再帰的に検索する必要はあるのでしょうが。
#ただし、calc.exeを例に挙げると、それで見つかったものが電卓なのかどうかを知るすべはないわけです。
calc.exeという名のブラウザかもしれませんし。
ちなみに
システムディレクトリを知るにはGetSystemDirectory()
ウィンドウズディレクトリを知るにはGetWindowsDirectory()
です。
お返事ありがとうございます
すいません、初心者なもので、再帰的とかが判らないのですが、
EXE名で探す事になるのでしょうか・・・
実行形式ファイル?というのかな、それを検索して、実行したいので・・・
とりあえず、FindFirstFileを試して見たいと思います。
システムディレクトリや、ウィンドウズディレクトリを知る関数は判るのですが、
それをどのように使えば良いか、不明なのです・・・すいません
>EXE名で探す事になるのでしょうか・・・
それはそうでしょう。
ショートカットを探すというのもあるんでしょうけど。
実際何をしたいのかを書けば、もっと具体的な回答が得られると思いますが。
#再起的に、と書いたのはFindFirstFileは指定したディレクトリ内しか検索できないので
それより子のディレクトリ内を探すには関数を再起的に呼び出さなければ見つからないと
いうことを言いたかったのです。
具体的に言えば、calc.exeがどこのディレクトリにあるか分からないで検索しなければなら
ない場合、ルートディレクトリからどんどん下を検索しなければならないということです。
こういう検索をするには「再起関数」を作らなければなりません。
FindFirstFileは要するに、指定したフォルダしか検索できないと言う事なのでしょうか?
いまいち理解できないのですが、
>具体的に言えば、calc.exeがどこのディレクトリにあるか分からないで検索しなければなら
>ない場合、ルートディレクトリからどんどん下を検索しなければならないということです。こういう検索をするに
>は「再起関数」を作らなければなりません。
実際、これと同じで、何処のディレクトリにcalc.exeが入っているのか判らないので
それを探し出してShellExecuteになるのでしょうか、とにかく実行したいわけです。
先ほどFindFirstFileを使用して見たのですが、使い方が上手くわからず
エラーで止まってしまうのですが、できれば具体的な使用例もお願いしたいのですが・・・
お手数かもしれませんがよろしくお願いします。
ちょっと横入りさせてもらいますが、
CdS さんが指摘されているとおり完全に自動的に探し出すというのは現実的ではないと思います。
ユーザーがパスを指定できるようにして、その補助機能として自動検索をつけるぐらいにとどめておいたほうが
無難ではないかと。
ただ、上の例のように電卓(Windowsに付属のアプリ)を起動したいということであれば、わざわざ検索しなくても、
GetWindowsDirectory や GetSystemDirectory を使って得たディレクトリ名に calc.exe を連結すれば十分です。
95 系はウィンドウズディレクトリ、NT 系はシステムディレクトリに付属のアプリが入っています。
固定のパスを指定したくなくてWindowsのシステムに入っているcalc.exeを
実行するという条件付きなら下記のようにやっても起動できるよ
char cDentakumsg[256];
strcpy(cDentakumsg, Calc.exe);
ShellExecute(NULL, open, cDentakumsg, NULL, NULL, SW_SHOWNORMAL);
パスを指定しなかった場合OS側でいくつかのディレクトリに
calc.exeが無いか探してくれて実行してくれるため
CreateProcessに載ってるけど
1.アプリケーションがロードされたディレクトリ
2.現在のディレクトリ
3.Windowsのシステム ディレクトリ(GetSystemDirectory)
4.Windowsディレクトリ(GetWindowsDirectory)
5.PATH環境変数内にリストされているディレクトリ
です
この5つ以外の条件(2番もフルパス指定した方が良いと思う)はフルパスを指定する必要がある
あと、FindFirstFileやその再起の使い方は他のページに載っている可能性が高いので
google等で検索してそれでも見つからなかった場合に質問するようにした方がよいよ
やはり、実際何がしたいかを具体的に書いたほうがいいですよ。
無駄な説明をしているかも知れないわけですし。(決して無駄にはならないとは思いますが)
電卓のようにシステムが持っているAPなのか、それ以外のAPなのか。
どちらでしょう。
それはなぜ、何処のディレクトリに入っているのか分からないのでしょう。
前もってINIやレジなどに設定しておくのはだめなのか?
kazumaさんのおっしゃる通りそのパスを入力させるUIはどうなのか?
そういったシステム的なことをもう少し詰めてみることも必要かと。
多くのレスありがとうございます。
すいません、どうしても質問がずれてしまっていて皆さんを悩ませる結果になってしまいました。
具体的には後で、自分からインストールしたゲームのEXEを探索して実行できる
ランチャーのような物を作りたかったのですが、皆さんの話を聞いていて
kazumaさんが言うようにユーザーに設定させれば良いのですが、ユーザーには判りやすく
したいため、どうしても自動でパスを求めたかったのです。
人によってインストール先は別々だと思うので何処のディレクトリに入っているか判らないわけです。
確かに自分のPCで使う上では問題無いのですが、どのパソコンでも動くようにしようと思うと
パス指定をさせなければいけない様ですね。
長々となってしまって申し訳無いですが、解決と言うわけではなく
諦めと言う形にしたいと思います。
CdSさん、kazumaさん、kuさん、ありがとうございました。