2011-09-12 14 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; 
} 

何? 「失敗した!:(」

私は、このチェックを外した場合、私はしかし、それは動作しません。ファイルダイアログを参照してくださいか、ファイル名ボックスはランダムなジャンクで予め充填されている。

私が変更した場合To:

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

"!:(失敗" ファイルダイアログ番組を示しておらず、問題なく実行

で何が起こっているのか

+0

私はあなたのコードを見ていませんが、メモリレイアウトを変更するとバグが修正されます。これは通常、悪いポインタやオーバーランのようなバグを意味します。 – atk

+1

これはおそらく 'fm'がジャンクで埋め込まれているためです。 – AJG85

+0

あなたはこれをより良い質問に編集しているようには見えないので、答えの代わりに大きなヒントを与えるつもりです: 'fm.lpstrFile'はnullで終わらなければなりません。 – 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); 
} 
。。!?!? lpstrFile状態の

documentation

ファイル名エディットコントロールを初期化するために使用されるファイル名。初期化が必要ない場合、このバッファの最初の文字はNULLでなければなりません。 GetOpenFileNameまたはGetSaveFileName関数が正常に返されると、このバッファには、ドライブ指定子、パス、ファイル名、および選択したファイルの拡張子が格納されます。

あなたはflnmを初期化しておらず、そこに問題があります。 GetOpenFileNameに電話する前に、flnm[0] = '\0'と書いて問題を解決することができます。