【发布时间】:2017-09-27 13:12:35
【问题描述】:
我的程序旨在让用户打开 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“const char *”类型的值不能分配给“LPCWSTR”类型的实体 错误 C2440 '=':无法从 'const char [39]' 转换为 'LPCWSTR' NewTry在filter 和title 行上。
【问题讨论】:
-
让我猜猜,你是在启用 Unicode 的情况下构建的(即定义了
UNICODE宏)?这意味着几乎所有字符串都需要是宽字符串。这是T宏的原因之一。修改您的字符串文字,例如T("Title here.") -
不,不要使用 TCHAR 宏。使用
L前缀@Someprogrammerdude -
@DavidHeffernan 虽然启用 Unicode 应该是默认的 IMO,但通过硬编码宽字符文字,如果代码用于
UNICODE的构建或项目中,则会遇到与此相反的问题没有定义的。或者对于可能跨平台使用的代码。我和其他人一样不喜欢使用 T 宏,但在旧的非 Unicode 接口被删除之前,不幸的是,我认为这是最好的折衷方案。 -
这段代码不能跨平台使用,现在支持Windows 95也没意义了。现在是 2017 年。是时候继续前进了。
-
@Someprogrammerdude 你记得部分正确。 C 运行时使用
_TCHAR、_T()(和其他下划线前缀的宏/定义)和_UNICODE。 Win32 API 使用TCHAR、LP(C)TSTR、TEXT()和UNICODE。
标签: c++ user-interface winapi