2016-02-12 20 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標誌是否有效似乎並不重要。也許這只是我特定機器中的一些奇怪之處。