gpt4 book ai didi

c - 第二次调用 GetOpenFileName 在 Win 8.1 64 位机器上无错误地崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:18 24 4
gpt4 key购买 nike

我正在从事的个人项目正在使用 tinyfiledialogs帮助处理一些跨平台的图形用户界面;这对我测试过的 Unix 系统非常有效,但是我在 Windows 8.1 64 位机器上测试时遇到了问题。

GetOpenFileName() 函数,当从 tinyfiledialogs.c 或下面的代码调用时,将在第一次调用时正确执行,但在对话框窗口后不久崩溃呈现在第二个。然而,这似乎发生在我的 64 位机器上 - 在 Windows 7 32 位机器上运行以下代码(或我使用 tinyfiledialogs.c 的代码)无需问题。

#include <stdio.h>
#include <windows.h>

void openD(){

char Filestring[1024] = "\0";
OPENFILENAME ofn={0};

ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = Filestring;
ofn.nMaxFile = 1024;
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;

int retval = GetOpenFileName(&ofn);
if(retval == 1) printf("True!\n");
else {
printf("value: %d\n", retval);
int err_val = CommDlgExtendedError();
switch(err_val){
case CDERR_DIALOGFAILURE: printf("ERR: CDERR_DIALOGFAILURE\n"); break;
case CDERR_FINDRESFAILURE: printf("CDERR_FINDRESFAILURE\n"); break;
case CDERR_INITIALIZATION: printf("CDERR_INITIALIZATION\n"); break;
case CDERR_LOADRESFAILURE: printf("CDERR_LOADRESFAILURE\n"); break;
case CDERR_LOADSTRFAILURE: printf("CDERR_LOADSTRFAILURE\n"); break;
case CDERR_LOCKRESFAILURE: printf("CDERR_LOCKRESFAILURE\n"); break;
case CDERR_MEMALLOCFAILURE: printf("CDERR_MEMALLOCFAILURE\n"); break;
case CDERR_MEMLOCKFAILURE: printf("CDERR_MEMLOCKFAILURE\n"); break;
case CDERR_NOHINSTANCE: printf("CDERR_NOHINSTANCE\n"); break;
case CDERR_NOHOOK: printf("CDERR_NOHOOK\n"); break;
case CDERR_NOTEMPLATE: printf("CDERR_NOTEMPLATE\n"); break;
case CDERR_STRUCTSIZE: printf("CDERR_STRUCTSIZE\n"); break;
case FNERR_BUFFERTOOSMALL: printf("FNERR_BUFFERTOOSMALL\n"); break;
case FNERR_INVALIDFILENAME: printf("FNERR_INVALIDFILENAME\n"); break;
case FNERR_SUBCLASSFAILURE: printf("FNERR_SUBCLASSFAILURE\n"); break;
}
}
}

int main()
{
openD();
openD();
}

第一次调用返回TRUE,第二次返回失败,程序崩溃。使用 VS Express 2012 调试器附加到程序的运行实例会在第二次调用时捕获以下异常;首先是一个弹出窗口:

ofd_64.exe 中 0x759C36DC (shell32.dll) 的未处理异常:0xC0000005:访问冲突读取位置 0x70017AD8。

在输出中跟随:

ofd_64.exe 中 0x759C36DC (shell32.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x70017AD8。
ofd_64.exe 中 0x759C36DC (shell32.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x70017AD8。

在 Windows 8.1 机器上的多次试验中,异常(exception)情况一直保持不变。

奇怪的是,如果我删除 OFN_EXPLORER 标志,进程会正常执行这两个调用。但这不是一个好的解决方案。任何帮助将不胜感激。

编辑:

VS Express 2012 的调用堆栈显示:

shell32.dll!00007ffe6ef02777()  Unknown
shell32.dll!00007ffe6ebbf1c4() Unknown
shell32.dll!00007ffe6ea5b5f3() Unknown
shell32.dll!00007ffe6ea5b555() Unknown
shell32.dll!00007ffe6ea5b493() Unknown
shell32.dll!00007ffe6ea5b386() Unknown
shell32.dll!00007ffe6eb07f02() Unknown
shell32.dll!00007ffe6eb86d78() Unknown
shell32.dll!00007ffe6e93bf9b() Unknown
ExplorerFrame.dll!00007ffe5b912b30() Unknown
ExplorerFrame.dll!00007ffe5b912abd() Unknown
ExplorerFrame.dll!00007ffe5b8ff511() Unknown
shell32.dll!00007ffe6e8043ed() Unknown
shell32.dll!00007ffe6e813e1f() Unknown
SHCore.dll!00007ffe6c30142f() Unknown
ntdll.dll!00007ffe71bab247() Unknown
ntdll.dll!00007ffe71bc8e15() Unknown
kernel32.dll!00007ffe706b13d2() Unknown
ntdll.dll!00007ffe71ba54e4() Unknown

最佳答案

正如其他地方向我建议的那样,我尝试在 openD 函数调用之前调用 CoInitializeEx - 这已经解决了问题,但我不能说出原因。我是否使用 COINIT_APARTMENTTHREADEDCOINIT_MULTITHREADED 标志似乎并不重要,两者都有效。也许这只是我的特定机器中的一些奇怪之处。

关于c - 第二次调用 GetOpenFileName 在 Win 8.1 64 位机器上无错误地崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com