Winapi GetOpenFileName扩展过滤器无法正常工作

时间:2015-12-04 16:03:12

标签: c++ function winapi std 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";

enter image description here

但是当我通过参数动态分配扩展过滤器时,它会失败,过滤器不会出现在组合框中:

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

enter image description here

我假设问题出在字符串转换中,但无法解决。

4 个答案:

答案 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");