GetOpenFileName() убивает мои фоновые открытые потоки:(
Это немного странно. Итак, я работаю с игровым движком OGRE, у которого есть класс "SceneManager", который поддерживает некоторые потоки файлов открытыми в фоновом режиме. Если я использую эти потоки только ДО использования GetOpenFileName(), то эти потоки работают нормально, но если я пытаюсь использовать эти потоки ПОСЛЕ GetOpenFileName(), эти страмы оказываются закрытыми. Может кто-нибудь пролить свет на то, почему GetOpenFileName() убивает мои фоновые потоки?
String Submerge::showFileDialog(char* filters, bool savedialog, char* title)
// need to tweak flags for open/save
{
OPENFILENAME ofn ;
char szFile[255] ;
HWND hwnd = NULL;
//getOgre()->getAutoCreatedWindow()->getCustomAttribute("WINDOW", &hwnd);
ZeroMemory( &ofn , sizeof(ofn) );
ofn.hwndOwner = hwnd;
ofn.lStructSize = sizeof ( ofn );
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof( szFile );
ofn.lpstrFilter = filters ? filters : "All files\0*.*\0";
ofn.nFilterIndex =1;
ofn.lpstrFileTitle = NULL ;
ofn.nMaxFileTitle = 0 ;
ofn.lpstrInitialDir=NULL ;
if(title!=NULL)
ofn.lpstrTitle=title;
//ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
MeshLoadTest(); // this is where i use background file streams
bool success = false;
if(savedialog)
success = GetSaveFileName( &ofn );
else
success = GetOpenFileName( &ofn );
MeshLoadTest(); // this is where i use background file streams
if(!success)
return "";
String str;
str.append(ofn.lpstrFile);
return str;
return "";
}
3 ответа
Обратите внимание, что GetOpenFileName()
может и изменит текущий каталог всего вашего процесса. Это может мешать чему-либо еще, что у вас происходит.
Есть опция под названием OFN_NOCHANGEDIR
, но согласно документации это неэффективно:
Восстанавливает текущий каталог к его первоначальному значению, если пользователь изменил каталог во время поиска файлов. Windows NT 4.0 / 2000 / XP: этот флаг не действует для GetOpenFileName.
Вы должны проверить текущий каталог до и после совершения этого вызова; если это изменится, то это может быть вашей проблемой. В этом случае добавьте код для сохранения и восстановления текущего каталога вокруг вызова GetOpenFileName()
,
Спасибо, ребята, и я сделал еще одно открытие, я использовал OFN_NOCHANGEDIR, и проблема была фактически решена (WinXP SP3), возможно, им нужно время от времени обновлять документы MSDN:P
(Это на самом деле ответ на другой ответ, где источник проблемы был идентифицирован при смене текущего каталога)
Чтобы сохранить текущий каталог:
#define ARRSIZE(arr) (sizeof(arr)/sizeof(*(arr)))
//...
TCHAR curDir[MAX_PATH];
DWORD ret;
ret=GetCurrentDirectory(ARRSIZE(curDir),curDir);
if(ret==0)
{
// The function falied for some reason (see GetLastError), handle the error
}
else if(ret>ARRSIZE(curDir))
{
// The function failed because the buffer is too small, implementation of a function that uses dynamic allocation left to the reader
}
else
{
// Now the current path is in curDir
}
Чтобы восстановить путь, просто сделайте
if(!SetCurrentDirectory(curDir))
{
// The function failed, handle the error
}
,
СОВЕТ: используйте функции TCHARS и обобщенные сопоставления текста вместо символов с самого начала приложения: это позволит избежать многих проблем в будущем, когда ваше приложение должно будет быть совместимо с путями Unicode.