无法识别空终止字符

时间:2016-02-14 14:30:29

标签: c++ winapi null-terminated

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

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

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

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

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

似乎\ 0在浏览文件对话框中未被识别为空字符,并且它根本不显示任何文件,我对c ++的了解是我的第一步,我无法使其工作在这个问题上没有任何帮助,我在网上搜索,但什么都没有派上用场。

有关如何使其发挥作用的任何建议吗?

2 个答案:

答案 0 :(得分:4)

您可以对带有嵌入式终结符的字符串使用std::string,但必须使用正确的std::string constructor来创建字符串。

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

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

答案 1 :(得分:0)

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

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

但如果有必要,我可以按照以下方式完成(我正在重复@Joachim Pileborg)

std::wstring filter = 
    L"All files|*.*|"
    L"Exe files|*.exe|";
std::replace(filter.begin(), filter.end(), '|', '\0');
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;