好的,我现在已经处理了这两天了,我找不到解决办法.
问题:我正在尝试使用Winapi 将过滤器设置为文件选择对话框.我正在使用GetOpenFileName
函数来执行此操作.此函数使用结构来设置文件扩展名筛选器等选项.这个结构的成员调用lpstrFilter
需要一定的字符串格式.我正在设置与Winapi指示完全相同的字符串,但由于某种原因,此字符串的值会发生变化.
我有这个静态const char*:
//This contains string "JPG" static const char * extensionFilter = v->trabajo10.C_JMV_SelectFile_FileExtension7.GetString(); //This forms a filter string which applies to OPENFILENAME structure. string sFilter; sFilter.append("Format: "); sFilter.append(extensionFilter); sFilter.push_back('\0'); sFilter.append("*."); sFilter.append(extensionFilter); sFilter.push_back('\0'); const char * filter = sFilter.c_str(); ofn.lpstrFilter = filter; //This sets: --> Format: JPG\0*.JPG\0 //This opens the file selection dialog if (GetOpenFileName(&ofn)==TRUE){ ...
文件选择对话框看起来正确,如下所示:
这个笑话现在来了,我修改了这样的代码:
//This contains string "JPG" static const char * extensionFilter = v->trabajo10.C_JMV_SelectFile_FileExtension7.GetString(); if(1){ //This forms a filter string which applies to OPENFILENAME structure. string sFilter; sFilter.append("Format: "); sFilter.append(extensionFilter); sFilter.push_back('\0'); sFilter.append("*."); sFilter.append(extensionFilter); sFilter.push_back('\0'); const char * filter = sFilter.c_str(); ofn.lpstrFilter = filter; //This sets: --> Format: JPG\0*.JPG\0 } //This opens the file selection dialog if (GetOpenFileName(&ofn)==TRUE){ ...
这是结果,问题:
过滤字符串被修改了???
if(1){ //This forms a filter string which applies to OPENFILENAME structure. string sFilter; sFilter.append("Format: "); sFilter.append(extensionFilter); sFilter.push_back('\0'); sFilter.append("*."); sFilter.append(extensionFilter); sFilter.push_back('\0'); const char * filter = sFilter.c_str(); ofn.lpstrFilter = filter; //This sets: --> Format: JPG\0*.JPG\0 }
该sFilter
变量具有寿命时的块在其中宣布结束该结束.返回的指针sFilter.c_str()
有效,直到sFilter
被修改或销毁.
它在失效后使用此指针.这和昨天的问题一样,我在评论中猜到了这个问题.这就是您需要显示完整MCVE的原因.这个问题看起来也与你一周前提出的问题重复:Winapi GetOpenFileName Extension Filter无效.我建议您花一些时间确保您完全理解返回值的有效性c_str()
.
sFilter
在完成指针之后,必须确保生命.sFilter
在外部块中声明以确保.