对 GetOpenFileName 的潜在错误用法

      在调用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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值