【问题标题】:Openfiledialog code working on VS2013 but failing in VS2019Openfiledialog 代码在 VS2013 上工作但在 VS2019 中失败
【发布时间】:2020-07-18 08:54:41
【问题描述】:

我有一个在 VS2005 上编写的 C++ 代码,它工作得很好,过了一段时间我将项目升级到 VS2013 没有问题,一切都按预期编译和工作。

最近我将我的一台计算机升级到 VS2019 并尝试在那里检查我的一个旧程序,代码没有编译并抛出了一堆与从 const char* 转换为 LPCWSTR 相关的错误。

函数调用:

    std::string inputFile, cwd;
    cwd = getCWD();

    flag = openMultipleFileDialog("Select a valid CSV file.", "CSV Files (*.csv)\0*.csv\0\0", cwd, inputFile);

函数定义:

int openMultipleFileDialog(std::string title, char* filter, std::string cwd, std::string& fileName)
{
    int ofnFlag;
    char buffer[4096];
    OPENFILENAME ofn = {0};

    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = buffer;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(buffer);
    ofn.lpstrTitle = title.c_str();
    ofn.lpstrInitialDir = cwd.c_str();
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;
    //ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ALLOWMULTISELECT;

    ofnFlag = GetOpenFileName(&ofn);
    fileName = buffer;

    return ofnFlag;
}

我将更新帖子以添加 VS2019 错误

我想知道为什么会发生这种情况,也许有什么东西在我的视线之外飞驰而过,VS 升级带来的变化比我预期的要多得多。

【问题讨论】:

  • GetOpenFileName 之前好像在映射 GetOpenFileNameA,现在正在映射 GetOpenFileNameW

标签: c++ visual-studio visual-c++


【解决方案1】:

使用 ASCII 变体 OPENFILENAMEAGetOpenFileNameA 而不是非显式变体。

搜索有关 Unicode 支持和UNICODE 宏的信息以获取更多信息。

【讨论】:

    【解决方案2】:

    GetOpenFileName 声明如下:

    WINCOMMDLGAPI BOOL APIENTRY GetOpenFileNameA(LPOPENFILENAMEA);
    WINCOMMDLGAPI BOOL APIENTRY GetOpenFileNameW(LPOPENFILENAMEW);
    #ifdef UNICODE
    #define GetOpenFileName GetOpenFileNameW
    #else
    #define GetOpenFileName GetOpenFileNameA
    #endif // !UNICODE
    

    GetOpenFileNameA,它采用 const char* 类型的文件路径。

    GetOpenFileNameW,它采用 const wchar_t* 类型的文件路径。

    但是,VS2019 的默认Character Set 是Unicode。所以,它正在调用函数的w 版本。没有从 const wchar_t* 到 const char* 的自动转换。因此,我建议您可以显式调用 GetOpenFileNameA 而不是 GetOpenFileName。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多