在调用win32打开文件选择对话框时,可能你会用到GetOpenFileName接口,不知道你遇到过这个问题没有?那就是当你选择了某个文件后,再在程序中进行相关的文件操作(用相对路径),你会发现会操作失败。原因就是改接口会改变进程的当前路径,那么在用到相对路径的地方自然就不正确了。解决办法就是在Flags中加上OFN_NOCHANGEDIR标记就行了,用GetCurrentDirectory接口可证明。
char pa[MAX_PATH];
GetCurrentDirectory(MAX_PATH, pa);
cout << pa << endl;
TCHAR szFile[MAX_PATH] = { '\0' };
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.hInstance = (HMODULE)GetCurrentProcess();
ofn.lpstrInitialDir = "Release\\";
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;// | OFN_NOCHANGEDIR;
GetOpenFileName(&ofn);
GetCurrentDirectory(MAX_PATH, pa);
cout << pa << endl;
对于windows接口调用,还是尽量参考官方文档,至于官方文档中为提倡的奇淫技巧和用法,最好还是不要用了,说不定哪天微软发现这是个bug给修复了,那你不就完了?
参考:https://stackoverflow.com/questions/1945584/getopenfilename-kills-my-background-open-streams