错误 C2440:“=”:无法从 'const char *' 转换为 'LPCWSTR'

error C2440: '=': cannot convert from 'const char *' to 'LPCWSTR'

我是 Visual Studio 的新手,需要编译应用程序,但我收到错误:error C2440: '=': cannot convert from 'const char *' to 'LPCWSTR' 在线:

std::string open_file_dialog(
    std::string title,
    std::string filter)
{
    char filename[MAX_PATH];

    OPENFILENAME ofn;
    ZeroMemory(&filename, sizeof(filename));
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = filter.c_str();
    ofn.lpstrFile = filename;

我认为这可能与我的项目设置有关,因为我正在查看的源代码应该按原样编译。但是,我不是 100% 确定。有人可以帮我吗?

您可能激活了 UNICODE,因此 OPENFILENAME 变为 OPENFILENAMEW,而不是 OPENFILENAMEA,这就是您的 ofn.lpstrFilter = filter.c_str(); 失败的原因。

lpstrFilterW 版本中的 wchar_t*

您可能应该坚持使用 UNICODE 并改用 std::wstrings,这样您就可以最好地访问 WinAPI。某些函数在 A (Ansi) 模式下的工作方式不同(更差)。

关于 windows API 你需要知道的是它有两种风格,即 UNICODE 风格和 non -UNICODE 风格。

当您包含 windows.h

选择的风格取决于是否定义了 UNICODE。

即使不是大多数,也有很多 WINAPI 结构和函数只是宏,基本上只是在宏名称中添加 W 或 A 以获得您想要的东西的真实名称。

UNICODE 风格需要 wchar_t 字符类型,非 UNICODE 需要 char 类型(或指向它们的指针)。

因此,您要么必须对结构 and/or 函数使用非宏名称,要么将类型的使用调整为所需的宏定义(在您的情况下,使用 std::wstring 而不是 std::string).