символ с нулевым символом в конце не распознан

Я использую OPENFILENAME ofn способ открыть диалоговое окно просмотра файлов в приложении 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 ++ находятся на моих первых шагах, и я не могу заставить его работать без какой-либо помощи в этом вопрос, и я искал по сети, но ничего не пригодилось.

Любое предложение о том, как заставить это работать?

-1

Решение

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;
0

Другие решения

Ты можешь использовать std::string для строк со встроенными терминаторами, но вы должны использовать правильный std::string конструктор создать строку.

Более конкретно, либо тот, в котором вы явно указываете длину (номер 4 в ссылке на связанный конструктор), либо начальный и конечный итератор (номер 6). В этом случае первый лучше всего:

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

По вопросам рекламы [email protected]