【问题标题】: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]

【问题讨论】:

    标签: c++ winapi visual-c++


    【解决方案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。结果是访问冲突。

    当然最好杀死多字节应用程序,但如果必须以这种方式编译,则必须提供该缓冲区。

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 2010-11-05
      • 2011-11-12
      • 1970-01-01
      • 2011-11-24
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多