C ++(MS V S)GetOpenFileName

时间:2017-09-27 13:12:35

标签: c++ user-interface winapi

我的程序旨在让用户打开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  

同时在filtertitle行。

2 个答案:

答案 0 :(得分:2)

由于Windows 95/98 / ME 已死,目前的建议是使用Windows NT系列操作系统的本机Unicode支持。

显然,您已经有了这个设置,因为错误消息告诉我们GetOpenFileName被定义为GetOpenFileNameW。在WIndows 95上,它被定义为GetOpenFileNameAA变体意味着需要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页面的详细信息。