为啥 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 中不一致的内容(呵呵)。

我完全理解为什么lpstrFileLPSTR,因为路径被写入了这个变量。

很好,但为什么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 自动将选定的文件扩展名添加到文件名?

如何导入带有图像的工作表?

如何在C语言中添加背景图片

qt中getopenfilename设置中文按钮