-1

我是新手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% 确定。有谁可以帮我离开这里吗?

4

2 回答 2

3

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

当你包括windows.h

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

许多(如果不是大多数)WINAPI 结构和函数只是宏,基本上只是在宏名称中添加 W 或 A 以获得您想要的东西的真实名称。

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

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

于 2018-12-13T22:46:21.310 回答
0

您可能已经激活了 UNICODE,所以OPENFILENAME变成了OPENFILENAMEWOPENFILENAMEA这不是您ofn.lpstrFilter = filter.c_str();失败的原因。

lpstrFilter是版本wchar_t*中的一个W

您可能应该坚持使用 UNICODE 并更改为使用std::wstrings,这可以让您获得对 WinAPI 的最佳访问。某些功能在A(Ansi) 模式下的工作方式不同(更差)。

于 2018-12-13T22:20:03.497 回答