Я пытаюсь применить фильтры расширения файла к диалогу выбора файла.
Этот способ работает:
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();
Я предполагаю, что проблема в преобразовании строк, но не могу понять это.
Эта строка:
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';
Вы используете указатель на некоторую временную строку, которая, согласно http://www.cplusplus.com/reference/string/string/c_str/, msgstr «может быть аннулирован дальнейшими вызовами других функций-членов, которые изменяют объект.»
Наконец-то нашел ответ:
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){
. . .
Более короткая версия:
ofn.lpstrFilter = _T("Format: XML\0*.xml\0");