为啥 OPENFILENAME lpstrFileTitle 参数是 LPSTR 而不是 LPCSTR?
Posted
技术标签:
【中文标题】为啥 OPENFILENAME lpstrFileTitle 参数是 LPSTR 而不是 LPCSTR?【英文标题】:Why is OPENFILENAME lpstrFileTitle param a LPSTR and not LPCSTR?为什么 OPENFILENAME lpstrFileTitle 参数是 LPSTR 而不是 LPCSTR? 【发布时间】:2014-03-13 10:11:53 【问题描述】:我正在创建一些文件打开对话框,但偶然发现了 WinAPI 中不一致的内容(呵呵)。
我完全理解为什么lpstrFile
是LPSTR
,因为路径被写入了这个变量。
很好,但为什么lpstrFileTitle
不是LPCSTR
?我已经阅读了MSDN 的文档并四处搜索,并没有找到令人满意的解释,因为它看起来并没有以任何方式进行修改。
这是兼容性残留还是什么?
在传递 std::string 时会导致烦人的解决方法,因为我无法使用 c_str()
并求助于 &str[0]
。
【问题讨论】:
【参考方案1】:lpstrFileTitle
也是一个输出缓冲区。它包含所选文件的名称和扩展名,没有路径信息。
【讨论】:
我只是在编辑我的帖子,因为我也意识到了这一点。本来希望 MSDN 以与lpstrFile
类似的方式暗示它。谢谢!【参考方案2】:
相关旁注:您必须将 lpstrFileTitle 设置为非 Unicode 构建的有效缓冲区。
OPENFILENAME 的文档指出,如果指针为空,则忽略该字段。但是,至少从 VS2008 开始,MFC CFileDialog 代码已包含此代码:
VC\atlmfc\src\mfc\dlgfile.cpp
void CFileDialog::UpdateOFNFromShellDialog()
...
#ifdef UNICODE
...
#else
::WideCharToMultiByte(CP_ACP, 0, wcPathName + offset,-1, m_ofn.lpstrFileTitle, m_ofn.nMaxFileTitle, NULL, NULL);
m_ofn.lpstrFileTitle[m_ofn.nMaxFileTitle - 1] = _T('\0');
#endif
...
Unicode 支持正确处理 NULL lpstrFileTitle 并且 WideCharToMultiByte 基本上什么都不做。但是,添加的安全终止缓冲区的代码不会检查空指针或 nMaxFileTitle==0。结果是访问冲突。
当然最好杀死多字节应用程序,但如果必须以这种方式编译,则必须提供该缓冲区。
【讨论】:
以上是关于为啥 OPENFILENAME lpstrFileTitle 参数是 LPSTR 而不是 LPCSTR?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 中更改 OPENFILENAME 对话框的位置?
如何在 Windows 中更改 OPENFILENAME 对话框的位置?
当使用 OPENFILENAME 结构和 GetSaveFileName() 时,是不是有任何方法可以让 SOMETHING 自动将选定的文件扩展名添加到文件名?