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

解決


sato  2003-05-14 13:35:21  No: 51379  IP: [192.*.*.*]

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

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

編集 削除
瀬戸っぷ  2003-05-14 14:18:06  No: 51380  IP: [192.*.*.*]

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

編集 削除
瀬戸っぷ  2003-05-14 14:24:44  No: 51381  IP: [192.*.*.*]

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

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

編集 削除
YuO  2003-05-14 16:43:41  No: 51382  IP: [192.*.*.*]

> 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-14 17:20:11  No: 51383  IP: [192.*.*.*]

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

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

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

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

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

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

編集 削除
YuO  2003-05-14 18:04:05  No: 51384  IP: [192.*.*.*]

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

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

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

編集 削除
sato  2003-05-15 14:06:09  No: 51385  IP: [192.*.*.*]

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

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

編集 削除