【问题标题】:error C2440: '=': cannot convert from 'const char *' to 'LPCWSTR' [duplicate]错误 C2440:“=”:无法从“const char *”转换为“LPCWSTR”[重复]
【发布时间】:2019-05-15 04:48:12
【问题描述】:

我是使用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% 确定。有谁能帮帮我吗?

【问题讨论】:

  • OPENFILENAME是什么,lpstrFilter的类型是什么?
  • filter 是如何声明的?
  • 那么它应该可以工作。我们可以得到minimal reproducible example吗?
  • 你确定这条线吗?错误提示 strcpy。我在代码中没有看到strcpy
  • 这个问题已经被问了无数次了。请先做一些研究。这是one。和another one。和yet another one。这个清单还在继续。

标签: c++ winapi visual-studio-2015 lpcwstr


【解决方案1】:

你需要知道的windows API有两种风格,分别是UNICODE风格和non-UNICODE风格。

当你包含windows.h

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

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

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

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

【讨论】:

  • 这就是我的意思 - 所以我想我需要在项目设置中的某处选择 UNICODEnon-UNICODE
  • 我找到了!项目->属性->配置属性/常规->字符集设置为使用多字节字符集
  • @cerr :这是处理它的常用方法,但还有其他(更好的)方法。
  • @cerr:是的。就是那个。你绝对不想要的那个。文件名不在您的控制范围内。使用 ANSI 编码将不可避免地失败。使用 Unicode。
  • @cerr 更简单的解决方案是直接使用受影响的 API/结构的A 版本(以匹配您对std::string 的使用),然后您不必担心配置项目级别的字符集。 std::string open_file_dialog(...) { ...; OPENFILENAMEA ofn; ... GetOpenFileNameA(&ofn); ... }
【解决方案2】:

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

lpstrFilterW 版本中的wchar_t*

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多