フォルダのパスを取得するには?


Ito  2004-04-12 07:41:07  No: 53460

EXEのあるフォルダのパスを取得したいと思っているのですが、GetModuleFileNameを使ってみると、.exeまで入ってしまいます。
開発環境は  WindowsXP VisualC++.net SDKです。
よろしくお願いします。


RAPT  2004-04-12 07:58:24  No: 53461

PathRemoveFileSpec() と合わせて使えばよいかと。


シャノン  2004-04-12 18:27:31  No: 53462

俺も PathRemoveFileSpec を愛用していますが、これは IE が入ってない環境では使えないという理由で嫌う人が多いので代替策をば…

TCHAR szFileName[ MAX_PATH ];
GetModuleFileName( NULL, szFileName, MAX_PATH );
*( _tcsrchr( szFileName, _T( '\\' ) ) + 1 ) = _T( '\0 );

で。
末尾の \ マークも削りたい場合は + 1 を削除してください。


シャノン  2004-04-12 18:44:36  No: 53463

修正。
>*( _tcsrchr( szFileName, _T( '\\' ) ) + 1 ) = _T( '\0 );
*( _tcsrchr( szFileName, _T( '\\' ) ) + 1 ) = _T( '\0' );
シングルクォートが一個抜けてました。


たく  2004-04-12 19:29:29  No: 53464

示された代替策は危険です
おとなしくsplitpathを使ってください


キース  2004-04-12 22:14:52  No: 53465

俺も
GetModuleFileNameして
_splitpathで問題は無いと思いますが。


シャノン  2004-04-12 22:33:47  No: 53466

危険だそうで。ごめんなさいね。
_splitpath って今はじめて知りましたわ。勉強勉強。


たく  2004-04-13 02:00:55  No: 53467

危険てのは、
GetModuleFileNameで失敗したときにどうすんの?
ってこと


シャノン  2004-04-13 20:40:00  No: 53468

さて、それは少々おかしな話ではありませんか?
確かに俺っちのコードでは、szFileName 中に \ がなければ妙なことになるでしょう。
_splitpath では、第一引数の値が無効な場合にも正常な結果こそ得られないものの、危険なことはないようです。それは認めましょう。

しかしそれは、GetModuleFileName の戻り値を適切にチェックすればいいだけの話であり、GetModuleFileName が失敗する可能性を考えるならば、_splitpath を使った場合とてエラーチェックは省略できません。

それよりも、ちょっとぐぐってみたところ
_tcsrchr では、2バイト目の 0x5c 問題が発生する
_splitpath では発生しない
というのがありました。試してみたところ、どうやら確かなようです。

というわけで、改めて俺からも _splitpath あるいは PathRemoveFileSpec を推奨させていただきます。
0x5c 問題は面倒ですからねぇ…

#でも web を検索してみると、その危険なコードを使っているところが出て来る出て来る…


キース  2004-04-13 23:24:40  No: 53469

横から失礼。

単純に、シャノン氏の書き込みをコピペすると
エラー処理がないから・・・ってことじゃないんですかね、
たく氏の発言は。

違ったらスイマセン


シャノン  2004-04-14 01:34:28  No: 53470

#本題と外れつつあるのであまり長引かせたくないな…とか思いつつ
#食い下がってるのは俺か?とも思ったり。

確かにエラー処理はありません。
そのため、そのままコピペして、もし GetModuleFileName が失敗すればアクセス違反で落ちるでしょう。危険です。

では、たくさんは俺の代替案を使うのならエラー処理をすべきだ、と言ってくださったのでしょうか?そうではありません。
たくさんの2度の書き込みは「_splitpath を使えばエラー処理をせずとも安全だ」と読むことが出来ます。俺が納得いかないのはそこです。

確かに、同じエラー処理をしないのならば、アクセス違反で落ちないだけ _splitpath のほうが幾分マシでしょう。しかし、所詮は五十歩百歩。
フォルダのパスを取得するという当初の目的が達せられないことに変わりはありません。

結局のところ、GetModuleFileName が失敗する可能性を考えるならば、どちらの方法であろうとエラー処理はすべきなのです。
俺は、GetModuleFileName ってのはそうそう失敗しないだろう、と思ってますが。

ちなみに、それとは別として。

俺の代替案には 0x5c 問題があるため、俺も _splitpath 派に乗り換えます、というのは前述のとおりです。


たく  2004-04-14 03:55:58  No: 53471

うーん、あんまり考えてなかった^^;

ポインタ操作と2バイト文字の組み合わせで危険を感じて最初の発言。
で、実際に落ちそうな状況を考えると、GetModuleFileName がエラーの時かな、と2度目の発言。

あとは、バッファサイズが小さいときは(2とか)、示されたコードだとGetModuleFileNameでエラーチェックしてもストールするけど、
MAX_PATH だから大丈夫だし、マルチバイト以外ではそれほど問題なかったのですね。

失礼しました。


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

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






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