有点奇怪。好的,我正在使用OGRE游戏引擎,它有一个“SceneManager”类,可以在后台打开一些文件流。如果我在使用GetOpenFileName()之前使用这些流,那些流工作正常,但如果我尝试使用这些流AFTER 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 "";
}
答案 0 :(得分:3)
请注意,GetOpenFileName()
可以并且将更改整个过程的当前目录。这可能会干扰你正在进行的任何事情。
有一个名为OFN_NOCHANGEDIR
的选项,但根据documentation,它无效:
如果用户在搜索文件时更改了目录,则将当前目录还原为其原始值。 Windows NT 4.0 / 2000 / XP :此标志对 GetOpenFileName 无效。
您应该在拨打此电话前后检查当前目录;如果它改变那么这可能是你的问题。在这种情况下,添加代码以保存和恢复对GetOpenFileName()
的调用的当前目录。
答案 1 :(得分:1)
谢谢大家和我做了另一个发现,我使用OFN_NOCHANGEDIR并且问题实际上已经解决了(WinXP SP3),也许他们需要偶尔更新一次MSDN文档:P
答案 2 :(得分: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和通用文本映射函数而不是 char :这将避免您将来遇到很多麻烦,当您的应用程序需要时与Unicode路径兼容。