无法识别以空结尾的字符



我使用 OPENFILENAME ofn 方式在 win32 应用程序中打开浏览文件对话框。

我希望能够根据用户需求而不是对所有文件进行预定义使用动态文件过滤

ofn.lpstrFilter = L"All Files*.*";

我尝试用动态代码更改预定义代码,但似乎即使是以 null 结尾的字符在下面的代码中也被视为字符串

string UserChoice = "Exe Files*.exe";
wstring ChoiceTemp = s2ws(UserChoice); // convert string to lpcwstr
LPCWSTR FilterByUser = ChoiceTemp.c_str();
ofn.lpstrFilter = FilterByUser;

似乎在浏览文件对话框中 \0 没有被识别为空字符,它根本不显示任何文件,我对 c++ 的知识是我的第一步,如果没有任何帮助,我无法让它工作这个问题,我在网上搜索,但没有任何用场。

关于如何使其工作的任何建议?

可以将 std::string 用于带有嵌入式终止符的字符串,但必须使用正确的 std::string 构造函数来创建字符串。

更具体地说,可以是显式指定长度的迭代器(链接构造函数引用中的数字 4(或开始和结束迭代器(数字 6(。 在这种情况下,第一个是最好的:

string UserChoice("Exe Files*.exe", 16);

lpstrFilter通常是一个常量字符串,因此不需要std::wstring。只需定义一个常量字符串:

const wchar_t* filter = 
    L"All files*.*"
    L"Exe files*.exe";

但如有必要,可以按如下方式完成(我在皮尔堡重复@Joachim(

std::wstring filter = 
    L"All files|*.*|"
    L"Exe files|*.exe|";
std::replace(filter.begin(), filter.end(), '|', '');
ofn.lpstrFilter = filter.data();

使用 filter.data() 而不是 c_str() 。要选择特定过滤器,请使用nFilterIndex

wchar_t filename[MAX_PATH];
wcscpy_s(filename, L"c:\test\default file.txt");
OPENFILENAME ofn = { sizeof(OPENFILENAME) };
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 2; //select "Exe files"
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

最新更新