【发布时间】:2018-05-22 12:43:42
【问题描述】:
GetOpenFileName(出于可疑原因)在显示对话框时更改应用程序的当前目录。这可以通过将OFN_NOCHANGEDIR 指定为对话框初始化标志来在对话框关闭时重置:
OFN_NOCHANGEDIR 如果用户在搜索文件时更改了目录,则将当前目录恢复为其原始值。
然而,设置此标志并不会阻止函数在显示资源管理器对话框时更改当前目录。
这是多线程环境中的一个问题,其中其他线程依赖当前目录作为可执行文件的路径。
有没有办法防止GetOpenFileName 在显示资源管理器对话框和用户浏览文件夹时更改应用程序的当前目录?
【问题讨论】:
-
没有帮助,但“其他线程依赖当前目录保留的位置”不是(线程)问题吗?你不能让其他线程不需要这个吗? (相关entertainment)
-
看来这似乎无法避免,您唯一能做的就是让所有线程在当前目录中使用一个变量,并使所有文件访问都使用该变量进行绝对访问(该变量可以是一个参数,可以是线程全局的,也可以是全局的,如果所有线程都使用相同的当前目录)。
-
当你说“这是多线程环境中的一个问题,其他线程依赖当前目录作为可执行文件的路径”,他们永远不能依赖它。无论进程启动时发生了什么,都没有任何保证。所以我支持 Christan:如果可以,请修复应用程序。
-
@Christian.K 当一个应该显示文件夹内容的函数决定更改整个应用程序的当前目录时,我不明白这是一个线程问题。而且恐怕在资源工厂建立在当前目录逻辑(不是我写的)上的游戏上并不是那么容易。 “当前目录地狱”是我当然可以联系到的。
-
可以说,real 错误依赖于当前工作目录。它是一个进程范围的属性,任何线程都可以随时更改它。您无法可靠地控制多线程应用程序中的当前工作目录。始终构造完全限定的路径名。您可以调用
GetModuleFileName或朋友进入可执行文件的目录。
标签: c++ c winapi openfiledialog getopenfilename