C言語でコンソールアプリケーションを作成しています。
アプリケーションのパス、つまりEXEが配置されているパスを取得する方法
はどのようにするのでしょうか?
VBでいうところの「App.Path」です。
初歩的な質問で申し訳ないですが、よろしくお願いします。
Win32ならばGetModuleFileName()で、
Cならば、
int main(int argc, char *argv[])とした場合に
argv[0]に入っています。
ちなみに、どちらもEXEのファイル名まで入ってくるので、
文字列操作で必要なパス名を得てください。
argv[0]の場合、書き換えるのはよろしくないので
テンポラリにコピーしてからの方がいいと思いますが。
> int main(int argc, char *argv[])とした場合に
> argv[0]に入っています。
argv[0]にパスまでは入っていない可能性があります。
例えば,
int puts (const char *);
int main (int argc, char ** argv)
{
puts(argv[0]);
return 0;
}
というプログラムをコンパイルして,コマンドラインから
test
と起動した場合,出力は
test
となります。
#VC++ 5.0及び.Net Framework附属C/C++コンパイラで確認。
確実にパスが欲しければGetModuleFileName APIを呼び出す必要があります。
> argv[0]の場合、書き換えるのはよろしくないので
> テンポラリにコピーしてからの方がいいと思います
えーっと,argv[0]自体を書き換えても問題は発生しないことが,標準によって保証されています。
スタイルの問題として,書き換えることは良くないと思いますが。
>#VC++ 5.0及び.Net Framework附属C/C++コンパイラで確認。
環境依存…でしょうか。
VC++6 Win98SEではとりあえず表示されました。
データファイルなどのパスは相対パスで指定ですかね。
もっとも、私自身はGetModuleFileName()で処理していますが。
>えーっと,argv[0]自体を書き換えても問題は発生しないことが,標準によって保証されています。
>スタイルの問題として,書き換えることは良くないと思いますが。
そうでしたか(^_^;)
あまり標準とか調べていないので…(そんなんでいいのか………)
毎度フォローありがとうございます。
> 環境依存…でしょうか。
> VC++6 Win98SEではとりあえず表示されました。
そのようです。
Windows 95ではフルパスで,
Windows NTではコマンドラインのままで,
それぞれ表示されました。
#同一のバイナリです。
というわけで,argv[0]を当てにしない方が安全です。
NT系が主流になってきていますし。
回答、ご意見ありがとうございます。
大変参考になりました。
GetModuleFileName を使用したいと思います。
ありがとうございました。