だから私はちょうどこの記事を読みました: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspxそして、特定の状況でプログラムがクラッシュするのではないかと心配しています。私が意味するのは、それらの延長された長さのパスです。たとえば、SHGetPathFromIDList は MAX_PATH 制限を超えるパスを返しますか? また、返されたバッファは "\?\" で始まりますか? または、このプレフィックスはファイルまたはフォルダーの作成にのみ使用され、実際のパスを返す場合には使用されませんか? また、それが当てはまる場合、対応する PIDL からパス文字列の長さを取得する方法はありますか? また、パスが MAX_PATH 制限を超えるフォルダーまたはファイルを作成するときに、GetVolumeInformation 関数の lpMaximumComponentLength パラメーターを考慮する必要がありますか? また、そのようなパスと UNC パスは C++ ファイル I/O クラス - std::fstream クラスで受け入れられますか? 私は wchars を使用しています。
別の質問として、LB_DIR は拡張パスをサポートしていますか?
問題が発生する可能性があると思われるコードの例を次に示します。
case IDC_BOWSE:
{
WCHAR Path[MAX_PATH]; //Triggers an error in extended-length path ??
//char FolderName[MAX_PATH];
BROWSEINFO OpenStruct;
memset(&OpenStruct, 0, sizeof(BROWSEINFO));
OpenStruct.hwndOwner = hWnd;
OpenStruct.pidlRoot = NULL;
//OpenStruct.pszDisplayName = FolderName;
OpenStruct.lpszTitle = L"Some:";
OpenStruct.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_VALIDATE | BIF_NONEWFOLDERBUTTON | BIF_BROWSEINCLUDEFILES ;
DWORD msg;
if(SHGetPathFromIDList(SHBrowseForFolder(&OpenStruct), Path))
{
SetWindowText(GetDlgItem(hWnd, IDC_FILE), Path);
}
}
break;
//その他の例:
std::wstringstream ssTextureDataFolderPath;
ssTextureDataFolderPath << sOutPutPath << L"\\TexturesData";
if(!CreateDirectory(ssTextureDataFolderPath.str().c_str(), NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
return false;
パスが MAX_PATH 制限を超えている場合、GetVolumeInformation 関数の lpMaximumComponentLength パラメータをチェックしてコンポーネントの長さと一致させる必要がありますか?
前もって感謝します!