アプリケーションパスを取得するには?

解決


sato  2003-05-14 22:35:21  No: 51379

C言語でコンソールアプリケーションを作成しています。
アプリケーションのパス、つまりEXEが配置されているパスを取得する方法
はどのようにするのでしょうか?
VBでいうところの「App.Path」です。

初歩的な質問で申し訳ないですが、よろしくお願いします。


瀬戸っぷ  2003-05-14 23:18:06  No: 51380

Win32ならばGetModuleFileName()で、
Cならば、
int main(int argc, char *argv[])とした場合に
argv[0]に入っています。


瀬戸っぷ  2003-05-14 23:24:44  No: 51381

ちなみに、どちらもEXEのファイル名まで入ってくるので、
文字列操作で必要なパス名を得てください。

argv[0]の場合、書き換えるのはよろしくないので
テンポラリにコピーしてからの方がいいと思いますが。


YuO  2003-05-15 01:43:41  No: 51382

> 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]自体を書き換えても問題は発生しないことが,標準によって保証されています。
スタイルの問題として,書き換えることは良くないと思いますが。


瀬戸っぷ  2003-05-15 02:20:11  No: 51383

>#VC++ 5.0及び.Net Framework附属C/C++コンパイラで確認。

環境依存…でしょうか。
VC++6 Win98SEではとりあえず表示されました。
データファイルなどのパスは相対パスで指定ですかね。

もっとも、私自身はGetModuleFileName()で処理していますが。

>えーっと,argv[0]自体を書き換えても問題は発生しないことが,標準によって保証されています。
>スタイルの問題として,書き換えることは良くないと思いますが。

そうでしたか(^_^;)
あまり標準とか調べていないので…(そんなんでいいのか………)

毎度フォローありがとうございます。


YuO  2003-05-15 03:04:05  No: 51384

> 環境依存…でしょうか。
> VC++6 Win98SEではとりあえず表示されました。

そのようです。
Windows 95ではフルパスで,
Windows NTではコマンドラインのままで,
それぞれ表示されました。
#同一のバイナリです。

というわけで,argv[0]を当てにしない方が安全です。
NT系が主流になってきていますし。


sato  2003-05-15 23:06:09  No: 51385

回答、ご意見ありがとうございます。
大変参考になりました。
GetModuleFileName を使用したいと思います。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加