我正在尝试将文件的扩展名过滤器应用到文件的选择对话框中。
这种方式有效:
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 :(得分:1)
这一行:
s << "(*.exe) Windows Executable\0" << "*." << filter << "\0";
将以null结尾的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 :(得分:0)
您正在使用指向某些临时字符串的指针,根据http://www.cplusplus.com/reference/string/string/c_str/,&#34;可能会因进一步调用其他修改对象的成员函数而失效。&#34;
答案 2 :(得分: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){
. . .
答案 3 :(得分:0)
较短的版本:
ofn.lpstrFilter = _T("Format: XML\0*.xml\0");