C++ ( MS V S ) 获取打开文件名

C++ ( MS V S ) GetOpenFileName

本文关键字:获取 文件名 MS C++      更新时间:2023-10-16

我的程序旨在让用户打开2个文件,然后以特定方式比较它们。我正在使用Visual Studio在C++中使用GUI创建它(如果这不是最好的方法,请纠正我,我只知道如何在Linux上编写C代码):

OPENFILENAME open;
ZeroMemory(&open, sizeof(open));
open.lStructSize = sizeof(LPOPENFILENAMEA);
open.lpstrFilter = "Files*.csv;*.xls";
open.nFileOffset = 1;
open.lpstrFile[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行上。

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

显然,您已经进行了该设置,因为错误消息告诉我们GetOpenFileName被定义为GetOpenFileNameW.在 WIndows 95 上,它被定义为GetOpenFileNameA.A变体意味着它需要const char*参数,W变体需要const wchar_t*

您可以使用L前缀定义wchar_t宽字符串文本,即L"Files...".你也可以使用std::wstring,它c_str()方法返回一个以null结尾的const wchar_t*

看起来你正在做一个 unicode 构建。

如果您查看字符串结构成员上 one 的定义,例如lpstrFilter,您会发现它被定义为LPTSTR。第一个T表示文本类型为 ASCII 或 Unicode,具体取决于您的构建方式。

若要处理这两种情况,请在输入字符串文本时使用_T宏:

open.lpstrFilter = _T("Files*.csv;*.xls");

这将在非 Unicode 构建上为您提供一个 ASCII 字符串,在 Unicode 构建上为您提供一个 Unicode 字符串。

如果你只希望以Unicode为目标,那么你可以通过在字符串前面加上L来显式获取Unicode字符串:

open.lpstrFilter = L"Files*.csv;*.xls";

Microsoft其 Unicode 编程摘要页面上的详细信息。