错误 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();
失败的原因。
lpstrFilter
是 W
版本中的 wchar_t*
。
您可能应该坚持使用 UNICODE 并改用 std::wstring
s,这样您就可以最好地访问 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).
我是 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();
失败的原因。
lpstrFilter
是 W
版本中的 wchar_t*
。
您可能应该坚持使用 UNICODE 并改用 std::wstring
s,这样您就可以最好地访问 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).