0

我正在尝试将文件的扩展名过滤器应用于文件的选择对话框。

这种方式有效:

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();

在此处输入图像描述

我假设问题出在字符串转换中,但无法弄清楚。

4

4 回答 4

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是可疑的。如果您必须这样做以消除编译器错误 then extFilteris not a compatible data type 开始,则类型转换隐藏了代码中的错误。摆脱类型转换:

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

如果代码无法编译,那么您做错了什么,需要正确修复它。

另一方面,如果extFilter是一个以空结尾的char字符串开头,则无需在将其传递给之前将其分配给变量operator<<()

s << "(*.exe) Windows Executable" << '\0' << "*." << extFilter << '\0';
于 2015-12-04T16:56:38.217 回答
0

一个较短的版本:

ofn.lpstrFilter = _T("Format: XML\0*.xml\0");
于 2017-08-01T12:38:18.850 回答
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){
. . .
于 2015-12-11T14:42:18.320 回答
0

您正在使用指向某个临时字符串的指针,根据http://www.cplusplus.com/reference/string/string/c_str/,“可能会因进一步调用修改对象的其他成员函数而失效。”

于 2015-12-04T16:11:06.217 回答