我正在尝试将文件的扩展名过滤器应用于文件的选择对话框。
这种方式有效:
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";
正在传递以 null 结尾的 char*
字符串到 operator<<()
,因此在运行时实际上与这段代码表现相同:
s << "(*.exe) Windows Executable" << "*." << filter << "";
空值永远不会进入 s
.
要正确插入空值,您需要将它们分配给 stringstream
作为个人char
值而不是 char*
值(value)观:
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';
关于c++ - Winapi GetOpenFileName 扩展过滤器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092427/