2016-02-12 114 views
1

一个个人项目我正在使用tinyfiledialogs帮助一些跨平台的GUI的东西;这对我测试过的Unix系统非常有用,但是在Windows 8.1 64位机器上测试时遇到了问题。到GetOpenFileName第二个呼叫没有错误崩溃在Win 8.1 64位机

当从tinyfiledialogs.c或下面的代码调用时,GetOpenFileName()函数将在第一次调用时正确执行,但会在第二次调用对话窗口后立即崩溃。然而,这仅出现要我的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调试器连接到正在运行的程序实例时,会在第二次调用时捕获以下异常:第一个弹出:

Unhandled exception at 0x759C36DC (shell32.dll) in ofd_64.exe: 0xC0000005: Access violation reading location 0x70017AD8.

通过遵循输出:

First-chance exception at 0x759C36DC (shell32.dll) in ofd_64.exe: 0xC0000005: Access violation reading location 0x70017AD8. Unhandled exception at 0x759C36DC (shell32.dll) in ofd_64.exe: 0xC0000005: Access violation reading location 0x70017AD8.

在Windows 8.1中的机器例外都保持不变,在多次试验。

奇怪的是,如果我删除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 
+0

你仍然有你的问题编译代码64位(执行跟踪显示您使用的是32位码) – purplepsycho

+0

是否有一个堆栈跟踪? –

+1

根据MSDN的评论,有一个错误可能解释您得到的结果:“使用MFC编译为多字节字符时,必须将lpstrFileTitle设置为有效指针”。见https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839%28v=vs.85%29.aspx –

回答

1

至于建议我在其他地方,我试着打电话之前openD功能CoInitializeEx调用 - 这已经解决了这个问题,尽管我别说为什么。我使用COINIT_APARTMENTTHREADEDCOINIT_MULTITHREADED标志是否有效似乎并不重要。也许这只是我特定机器中的一些奇怪之处。