当前位置:  开发笔记 > 编程语言 > 正文

C++ Simple IF子句更改静态const char变量的值

如何解决《C++SimpleIF子句更改静态constchar变量的值》经验,为你挑选了1个好方法。

好的,我现在已经处理了这两天了,我找不到解决办法.

问题:我正在尝试使用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){
...

这是结果,问题:

在此输入图像描述

过滤字符串被修改了???



1> David Heffer..:
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在外部块中声明以确保.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有