Winapi GetOpenFileName Расширение фильтра не работает

Я пытаюсь применить фильтры расширения файла к диалогу выбора файла.

Этот способ работает:

ofn.lpstrFilter =
"(*.exe) Windows Executable\0*.exe\0""(*.ini) Windows Initialization file \0*.ini\0""(*.dll) Dynamic Link Library \0*.dll\0""(*.lib) Windows Library file \0*.lib\0""(*.conf) Windows Configuration file \0*.conf\0";

введите описание изображения здесь

Но когда я назначаю фильтры расширения динамически, через параметры, это не удается, фильтры не отображаются в поле со списком:

LPCSTR filter = (LPCSTR)extFilter; //Contains string "bmp"
stringstream s;
s << "(*.exe) Windows Executable\0" << "*." << filter << "\0";
string ffilter = s.str();
ofn.lpstrFilter = ffilter.c_str();

введите описание изображения здесь

Я предполагаю, что проблема в преобразовании строк, но не могу понять это.

0

Решение

Эта строка:

s << "(*.exe) Windows Executable\0" << "*." << filter << "\0";

Проходит терминирует char* Строки для operator<<()и, следовательно, эффективно ведет себя так же, как этот код во время выполнения:

s << "(*.exe) Windows Executable" << "*." << filter << "";

Нули никогда не превращаются в s,

Чтобы правильно вставить нули, вам нужно назначить их stringstream как личность char значения, а не как char* ценности:

s << "(*.exe) Windows Executable" << '\0' << "*." << filter << '\0';

Кроме того, тот факт, что вы кастинг extFilter подозрительно Если вам нужно сделать это, чтобы избавиться от ошибки компилятора, то extFilter это не совместимый тип данных для начала, приведение типов скрывает ошибку в вашем коде. Избавьтесь от набора типов:

LPCSTR filter = extFilter; //Contains string "bmp"

Если код не компилируется, значит, вы делаете что-то не так и вам нужно исправить это правильно.

С другой стороны, если extFilter является нулевым символом char для начала, вам не нужно присваивать переменную перед передачей operator<<():

s << "(*.exe) Windows Executable" << '\0' << "*." << extFilter << '\0';
1

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

Вы используете указатель на некоторую временную строку, которая, согласно http://www.cplusplus.com/reference/string/string/c_str/, msgstr «может быть аннулирован дальнейшими вызовами других функций-членов, которые изменяют объект.»

0

Наконец-то нашел ответ:

const char * extensionFilter = myParamVar; //Contains "JPG" string

string sFilter;
sFilter.append("Format: ");
sFilter.append(extensionFilter);
sFilter.push_back('\0');
sFilter.append("*.");
sFilter.append(extensionFilter);
sFilter.push_back('\0');

//Current filter content --> Format: JPG\0*.JPG\0

const char * filter = sFilter.c_str(); //Char string conversion
ofn.lpstrFilter = filter; //Set the filter to the sctructure's member.

//Opens the dialog and it successfully applies the filter.
if (GetOpenFileName(&ofn)==TRUE){
. . .
0

Более короткая версия:

ofn.lpstrFilter = _T("Format: XML\0*.xml\0");
0
По вопросам рекламы [email protected]