[スレッド全体]

2008/6/24 (火) 12:25:16 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5367] Re2:長過ぎるパス名で落ちる
▼ kobakeさん
いえ、FALSEは返ってきません。
エラー処理は元々実装されているので、FALSEが来れば最初から問題無いです。
APIがおかしいのか .nMaxFile をよほど小さくしないとtoo smallは返ってこないので別の対応が必要です。まぁ使い方がおかしいだけかもしれませんが……

ANSIなので絶対パスは260バイト以下なわけですが、260バイト目まで文字を詰め込んできます。切れ目が2バイト文字の途中の場合、259バイト目まで詰め込んで260バイト目に0を書かずに返ってきます。

仮に今回too smallが来たとしても、ANSIで260バイトを超える絶対パスはMSの取り決めに反します。
260バイトを超えた絶対パスでいくとどうなるかは私は知りません。

2008/6/24 (火) 23:33:31 kobake  
Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
[5368] Re3:長過ぎるパス名で落ちる
▼ なすこじさん
> ▼ kobakeさん
> いえ、FALSEは返ってきません。
> エラー処理は元々実装されているので、FALSEが来れば最初から問題無いです。
> APIがおかしいのか .nMaxFile をよほど小さくしないとtoo smallは返ってこないので別の対応が必要です。まぁ使い方がおかしいだけかもしれませんが……
>
> ANSIなので絶対パスは260バイト以下なわけですが、260バイト目まで文字を詰め込んできます。切れ目が2バイト文字の途中の場合、259バイト目まで詰め込んで260バイト目に0を書かずに返ってきます。
>
> 仮に今回too smallが来たとしても、ANSIで260バイトを超える絶対パスはMSの取り決めに反します。
> 260バイトを超えた絶対パスでいくとどうなるかは私は知りません。


なるほど、失礼しました。確かに試すとTRUEが返りますね。
がっつりエラーチェックをするならこんな↓感じですかね (ここまでやるか、っつー極端な例かもしれませんが)。

OPENFILENAME ofn;

BOOL bRet = GetOpenFileName(&ofn);
DWORD dwErr = GetLastError();
if(dwErr==ERROR_INVALID_PARAMETER){
        //想定外。プログラム側の問題 (だと思う)。
}
else if(dwErr==ERROR_OUTOFMEMORY){
        //メモリ不足。
}
else if(dwErr==ERROR_INSUFFICIENT_BUFFER){
        //バッファが足りない。バッファをもうちょい確保して再試行する or 失敗メッセージを出す?
}
else if(bRet){
        //成功。ユーザの入力したパスが正常に取得できた。
}
else{
        //ユーザキャンセル。
}


ちなみに環境依存かもしれないですけど(?)、Windows Vista Home Edition の環境では、
バッファを最初から _MAX_PATH*2 確保しておくと、んまぁ一応正常動作しました。結果論ですが。

2008/6/25 (水) 12:43:47 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5369] Re4:長過ぎるパス名で落ちる
▼ kobakeさん
API側がANSIなのに文字カウントをunicodeで行なっている様な変な動作をしているので、おっしゃる様な処理をしないと厳密にはできないですね。

> ちなみに環境依存かもしれないですけど(?)、Windows Vista Home Edition の環境では、
> バッファを最初から _MAX_PATH*2 確保しておくと、んまぁ一応正常動作しました。結果論ですが。


確認ありがとうございます。98,NT以降で大丈夫なのかもしれませんが、
・undocumentedな動作である
・沢山の所で_MAX_PATHが使われているので拡張すると確認が大変
・unicode版なら長いパスを正しく扱えるのでANSI版が対応してなくても大丈夫


ということで、バッファの拡張は行なわずにオーバーフローチェック&エラー表示するだけのパッチを作りました。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.000]