2009-12-22 2 views
2

Его немного странно. Хорошо, поэтому я работаю с игровым движком OGRE, который имеет класс SceneManager, который поддерживает некоторые потоки файлов, открытые в фоновом режиме. Если я использую эти потоки только ПЕРЕД используя GetOpenFileName() эти потоки работают нормально, но если я пытаюсь использовать эти потоки ПОСЛЕ GetOpenFileName() эти strams будут найдены быть закрыты. Может кто-нибудь пролить некоторый свет, почему 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, но в соответствии с documentation, это неэффективно:

Восстанавливает текущий каталог к ​​исходному значению, если пользователь изменил каталог при поиске файлов. Windows NT 4.0/2000/XP: Этот флаг недействителен для GetOpenFileName.

Вы должны проверить текущий каталог до и после совершения этого вызова; если он изменится, это может быть вашей проблемой. В этом случае добавьте код для сохранения и восстановления текущего каталога вокруг вызова до GetOpenFileName().

+0

хммм, что звучит интересно, как остановить такое поведение тогда? –

+0

Я обновил свой ответ с дополнительной информацией. –

+0

Perfecto, это имеет смысл. Я использую winXP и yep, каталог меняется, так как файлы, которые я просматриваю, всегда находятся в другом каталоге. Я немного нуб в программировании win32, поэтому, только если вы можете сказать мне, как записывать и позже восстанавливать рабочий каталог, пожалуйста :) –

0

(Это на самом деле ответ на другой ответ, где был выявлен источник проблемы в изменении текущего каталога)

Чтобы сохранить текущую директорию:

#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 пути.

+0

эй, это было сложно, спасибо за объяснение :) –

+0

Вы привыкнете к нему, если вам придется использовать множество API-интерфейсов Windows, выводящих строки ... но это не вина WinAPI, а C: Строки C могут быть действительно отвратительными. : -S –

1

Спасибо, ребята, и я сделал еще одно открытие, я использовал OFN_NOCHANGEDIR и проблема была фактически решена (WinXP SP3), может быть, они должны обновить MSDN документы один раз в некоторое время: P

+1

Не полагайтесь на недокументированные функции: они могут измениться в любой момент в будущем, и ваше приложение внезапно перестанет работать в любой будущей версии Windows. Я бы пошел с решением для сохранения/восстановления. –

+1

Okey, я скоро вернусь, чтобы сохранить/восстановить подход ... –

+0

Молодцы! :-) (случайный текст до 15 символов) –

Смежные вопросы