在没有MFC的win32中保存/打开通用对话框

vir*_*raj 3 c++ winapi dialog file

如何使用纯非托管Win32 API创建deafault Save/Open对话框?按照此处的指南,WM_CREATE在主窗口的消息循环中处理消息时执行以下代码:Ive included <Commdlg.h>.

            OPENFILENAMEA ofn;
        char Buffer[300];
        fill(Buffer, Buffer + 300, '\0');
        ofn.lStructSize = sizeof(OPENFILENAMEA);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFile = Buffer;
        ofn.nMaxFile = 300;
        ofn.Flags = OFN_EXPLORER;
        ofn.lpstrFilter = NULL;
        ofn.lpstrCustomFilter = NULL;
        ofn.nFilterIndex = 0;
        ofn.lpstrFileTitle = NULL;
        ofn.lpstrInitialDir = NULL;
        ofn.lpstrTitle = NULL;
        out << GetOpenFileNameA(&ofn) << endl;
        out << Buffer << (int)CommDlgExtendedError();
Run Code Online (Sandbox Code Playgroud)

但是,此代码无论如何都会产生NO输出.救命?!

Han*_*ant 7

处理WM_CREATE消息时执行以下代码

查看"输出"窗口,观察0xc0000005的第一次机会异常通知,即AccessViolation异常.Wow64模拟器中有一个支持,在调度WM_CREATE时会吞下异常.

异常是由于未完全初始化OPENFILENAMEA结构引起的.快速解决:

 OPENFILENAMEA ofn = {0};
Run Code Online (Sandbox Code Playgroud)

并且在调用ShowWindow()而不是WM_CREATE消息处理程序之前支持显示对话框.