【发布时间】:2015-12-11 12:45:12
【问题描述】:
好的,我已经处理了两天了,但我找不到解决方案。
问题:我正在尝试使用 Winapi 将过滤器设置为 文件选择对话框。我正在使用GetOpenFileName 函数来执行此操作。此函数使用 结构 来设置选项,例如文件扩展名过滤器。这个结构的成员lpstrFilter 需要一定的字符串格式。我完全按照 Winapi 的指示设置该字符串,但由于某种原因,该字符串的值发生了变化。
我有这个 static 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){
...
这就是结果,问题:
过滤器字符串被修改???
【问题讨论】:
-
如果您在调用
GetOpenFileName之前使用了调试器并检查了OPENFILENAME结构,您就不必问这个问题了。这个问题弥补了事实。 -
@IInspectable 我无法使用调试器,我使用的 IDE 不允许。
-
@ProtectedVoid 您使用哪个 IDE?并且您始终可以单独获得调试器; WinDbg 和 gdb 都可以独立于 IDE 运行。
-
@andlabs 我使用 CA Plex 6.1。这是一个相当古老的 IDE,可让您创建多平台应用程序。我别无选择,我必须使用这个 IDE。它甚至不允许您定义 C++ 函数。它迫使您像使用简单的脚本语言一样使用 C++ 进行编程。我希望你能多了解我的局限。
-
这实际上不是
if子句。这是大括号{}括号内的任何声明都属于不同的范围,它们不会在括号外看到。
标签: c++ winapi memory reference getopenfilename