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.

Другие вопросы по тегам