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

时间:2018-12-13 22:14:48

标签: c++ winapi visual-studio-2015 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%。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您需要了解的有关Windows API的信息是它有2种样式,即 UNICODE 样式和 non -UNICODE样式。

包含windows.h

选择的口味取决于是否定义了UNICODE。

如果不是大多数的WINAPI结构和函数,大多数也只是将宏W或A添加到宏名称中以获取所需事物的真实名称的宏。

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

因此,您必须对结构和/或函数使用非宏名称,或者将类型的使用调整为所需的宏定义(在您的情况下,请使用std :: wstring代替std :: string)。 / p>

答案 1 :(得分:0)

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

lpstrFilterwchar_t*版本的W

您可能应该坚持使用UNICODE并更改为使用std::wstring,这将使您最好地访问WinAPI。在A(Ansi)模式下,某些功能的工作方式(更糟)。