我的程序旨在让用户打开2个文件,然后以特定方式对它们进行比较。我使用Visual Studio在C ++中使用GUI创建它(请纠正我,如果它不是最好的方法,我只知道如何在Linux上编写C代码):
OPENFILENAME open;
ZeroMemory(&open, sizeof(open));
open.lStructSize = sizeof(LPOPENFILENAMEA);
open.lpstrFilter = "Files\0*.csv;*.xls\0\0";
open.nFileOffset = 1;
open.lpstrFile[0] = '\0';
open.nMaxFile = 2048;
open.lpstrTitle = "Title here.";
open.Flags = OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST;
BOOL selected = GetOpenFileName(&open);
我收到以下编译错误:
E0513 a value of type "const char *" cannot be assigned to an entity of type "LPCWSTR" Error C2440 '=': cannot convert from 'const char [39]' to 'LPCWSTR' NewTry
同时在filter
和title
行。
答案 0 :(得分:2)
由于Windows 95/98 / ME 长已死,目前的建议是使用Windows NT系列操作系统的本机Unicode支持。
显然,您已经有了这个设置,因为错误消息告诉我们GetOpenFileName
被定义为GetOpenFileNameW
。在WIndows 95上,它被定义为GetOpenFileNameA
。 A
变体意味着需要const char*
个参数,W
变体需要const wchar_t*
。
使用wchar_t
前缀定义L
个宽字符串文字,即L"Files..."
。您也可以使用std::wstring
,它的c_str()
方法返回以null结尾的const wchar_t*
。
答案 1 :(得分:1)
看起来你正在做一个unicode构建。
如果您查看字符串结构成员的定义,例如lpstrFilter
,您会看到它被定义为LPTSTR
。第一个T
表示文本类型是ASCII或Unicode,具体取决于您的构建方式。
要处理这两种情况,请在输入字符串文字时使用_T
宏:
open.lpstrFilter = _T("Files\0*.csv;*.xls\0\0");
这将为您提供非Unicode构建的ASCII字符串,以及Unicode构建的Unicode字符串。
如果您只希望定位Unicode,那么您可以通过在字符串前加L
来显式获取Unicode字符串:
open.lpstrFilter = L"Files\0*.csv;*.xls\0\0";
Microsoft有关Unicode Programming Summary页面的详细信息。