Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenFileDialog类在c++;_C++_Openfiledialog - Fatal编程技术网

C++ OpenFileDialog类在c++;

C++ OpenFileDialog类在c++;,c++,openfiledialog,C++,Openfiledialog,我想显示OpenFileDialog打开的文件名,但它将错误的文本发送到标题栏。我已经改变了这个项目的角色集,但是没有任何帮助。这是我的密码: OpenFileDialog.h: class OpenFileDialog { public: OpenFileDialog(){}; void CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, L

我想显示OpenFileDialog打开的文件名,但它将错误的文本发送到标题栏。我已经改变了这个项目的角色集,但是没有任何帮助。这是我的密码:

OpenFileDialog.h:

    class OpenFileDialog  
    {
    public:
        OpenFileDialog(){};
        void CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex);
        ~OpenFileDialog(){};
        LPCWSTR result=L"";
    };
OpenFileDialog.cpp:

      void OpenFileDialog::CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex)
       {
    OPENFILENAME ofn;
    TCHAR szFile[MAX_PATH];
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.hwndOwner = hWnd;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = Filter;
    ofn.nFilterIndex = FilterIndex;
    ofn.lpstrTitle = Title;
    ofn.lpstrInitialDir = InitialDirectory;
    ofn.lpstrFileTitle = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


    if (GetOpenFileName(&ofn))
    {
         result = ofn.lpstrFile;
    }
    else
    {
        result = L"Empty";
    }
}
在WM_命令的windows过程中:

        case WM_COMMAND:
        {
            if (LOWORD(wParam) == ID_FILE_OPEN)
            {
                OpenFileDialog ofd;
                ofd.CreateOpenFileDialog(hwnd, L"Test", L"C:\\", L"All files(*.*)\0*.*\0TextFiles(*.txt)\0*.txt\0", 2);
                SetWindowText(hwnd, ofd.result);
            }
            break;
        }

非常感谢。

在函数
CreateOpenFileDialog()
中,用于存储文件名的缓冲区是一个本地数组
szFile[MAX\u PATH]
。在ofn结构中初始化
lpstrFile=szFile
,确保
GetOpenFileName()
将用户输入的结果放在正确的位置

问题是,只要从
CreateOpenFileDialog()
返回,它的局部变量就会被销毁,包括包含文件名的缓冲区。因此,使用
result=ofn.lpstrFile设置的
result
指针然后指向无效的内存位置

您可以通过在
OpenFileDialog
构造函数的
result
中直接分配缓冲区(或使其成为一个数组)来解决此问题,并将此指针直接用于
ofn.lpstrFile=buffer