Windows FileOpenDialog返回错误的路径

时间:2019-03-06 18:39:31

标签: c++ windows visual-studio winapi com

我希望有一个简单的文件对话框,用户可以在其中选择如下所示的文件夹。

image

在使用当前Visual Studio 2017的Windows 10构建上执行以下代码段时,我遇到了一个奇怪的问题。我做什么

  1. 在打开的文件对话框中创建一个新文件夹
  2. 输入文件夹的新名称
  3. 当新文件夹的文本光标仍然可见时,我单击“选择文件夹”。
  4. pszFilePath不是我为所选文件夹键入的名称,而是“新文件夹”。

相反,当我单击“选择文件夹”时,我希望对话框首先将焦点从新文件夹中移出,然后再次单击以实际选择文件夹。

奇怪的是,在我测试该代码的所有Windows 10系统上都不会发生这种情况。有时我无法重现该问题。

有人遇到同样的问题,也许可以解决吗?

#include <shobjidl.h>
#include <windows.h>

void winOpenFileDialog ()
{
    HRESULT hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED (hr))
    {
        IFileOpenDialog* pFileOpen;

        // Create the FileOpenDialog object.
        hr = CoCreateInstance (CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog,
            reinterpret_cast<void**> (&pFileOpen));

        if (SUCCEEDED (hr))
        {
            pFileOpen->SetOptions (FOS_PICKFOLDERS);
            // Show the Open dialog box.
            hr = pFileOpen->Show (NULL);

            FILEOPENDIALOGOPTIONS opt;
            pFileOpen->GetOptions (&opt);

            // Get the file name from the dialog box.
            if (SUCCEEDED (hr))
            {
                IShellItem* pItem;
                hr = pFileOpen->GetResult (&pItem);
                if (SUCCEEDED (hr))
                {
                    PWSTR pszFilePath;
                    hr = pItem->GetDisplayName (SIGDN_FILESYSPATH, &pszFilePath);

                    // Display the file name to the user.
                    if (SUCCEEDED (hr))
                    {
                        MessageBox (NULL, pszFilePath, L"File Path", MB_OK);
                        CoTaskMemFree (pszFilePath);
                    }
                    pItem->Release ();
                }
            }
            pFileOpen->Release ();
        }
        CoUninitialize ();
    }
}

0 个答案:

没有答案