我刚开始使用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%确定。有人能帮我吗?
关于windows API,您需要了解的是它有两种风格,即UNICODE风格和非-UNCODE风格。
当您包含windows.h
时
所选择的风味取决于是否定义了UNICODE。
许多(如果不是大多数的话(WINAPI结构和函数只是宏,基本上只是在宏名称中添加一个W或一个a,以获得您想要的东西的真实名称。
UNICODE风格需要wchar_t
的字符类型,而非UNICODE采用char
类型(或指向它们的指针(。
因此,您必须为结构和/或函数使用非宏名称,或者根据所需的宏定义调整类型的使用(在您的情况下,使用std::wstring而不是std::string(。
您可能激活了UNICODE,所以OPENFILENAME
变成了OPENFILENAMEW
,而不是OPENFILENAMEA
,这就是ofn.lpstrFilter = filter.c_str();
失败的原因。
lpstrFilter
是W
版本中的wchar_t*
。
您可能应该坚持使用UNICODE,并更改为使用std::wstring
s,这将使您获得对WinAPI的最佳访问权限。某些功能在A
(Ansi(模式下的工作方式不同(更差(。