2011-09-12 75 views
0

我似乎與GetOpenFileName有一個非常奇怪的問題。非常奇怪的GetOpenFileName問題

錯誤沒有明顯的原因,但是,如果我在錯誤檢查中調用CommDlgExtendedError(),錯誤從來沒有發生過。

這裏是我的代碼:

#include <windows.h> 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    OPENFILENAME fm; 
    char flnm[MAX_PATH]; 
    ZeroMemory(&fm, sizeof(fm)); 

    fm.lStructSize = sizeof(OPENFILENAME); 
    fm.hwndOwner = NULL; 
    fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0"; 
    fm.lpstrFile = flnm; 
    fm.nMaxFile = MAX_PATH; 
    fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; 
    fm.lpstrDefExt = ""; 

    if(!GetOpenFileNameA(&fm)) 
    { 
     MessageBoxA(NULL, "failed! :(", NULL, NULL); 
    } 

    return 0; 
} 

什麼顯示? 「失敗了!:(」

如果我刪除此檢查,我看到一個文件對話框,但它不工作,且文件名框中預填充隨機垃圾。

如果我改變至:

if(!GetOpenFileNameA(&fm)) 
{ 
    DWORD dwErr = CommDlgExtendedError(); 
    MessageBoxA(NULL, "failed! :(", NULL, NULL); 
} 

「!失敗了:(」 沒有顯示文件對話框並顯示沒有問題,執行

這是怎麼回事

+0

我沒有看過你的代碼,但是當改變內存佈局修正錯誤時,通常意味着錯誤指針或超出限制的錯誤 – atk

+1

這可能是因爲'fm'填充了垃圾。 – AJG85

+0

由於您似乎沒有將此編輯爲更好的問題,因此我將給您一個大提示,而不是回答:'fm.lpstrFile'必須爲空。 – AJG85

回答

5
OPENFILENAME fm; 
char flnm[MAX_PATH]; // nobody initialized me ... 
ZeroMemory(&fm, sizeof(fm)); 

fm.lStructSize = sizeof(OPENFILENAME); 
fm.hwndOwner = NULL; 
fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0"; 
fm.lpstrFile = flnm; // ... who knows what I am? 
fm.nMaxFile = MAX_PATH; 
fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; 
fm.lpstrDefExt = ""; 

if(!GetOpenFileNameA(&fm)) 
{ 
     MessageBoxA(NULL, "failed! :(", NULL, NULL); 
} 
!?!?種

documentationlpstrFile狀態:

用於初始化文件名​​編輯控件文件名。如果不需要初始化,此緩衝區的第一個字符必須爲NULL。當GetOpenFileName或GetSaveFileName函數成功返回時,此緩衝區將包含所選文件的驅動器指示符,路徑,文件名和擴展名。

您未初始化flnm並且其中存在問題。在致電GetOpenFileName之前,您可以通過書寫flnm[0] = '\0'來解決問題。