C ++ || IShellItem GetDisplayName缺失/随机驱动器号

时间:2015-10-03 15:14:50

标签: c++ mfc filepath

我试图在C ++中使用IFileOpenDialog接口选择一个文件,然后将其路径复制到一个字符串中,该字符串将显示在编辑框中。

首先,我将字符串复制到的全局变量定义如下:

 String[] formats = new String[] {
   "yyyy-MM-dd",
   "yyyy-MM-dd HH:mm",
   "yyyy-MM-dd HH:mmZ",
   "yyyy-MM-dd HH:mm:ss.SSSZ",
   "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
 };
 for (String format : formats) {
   SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
   System.out.format("%30s %s\n", format, sdf.format(new Date(0)));
   sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
   System.out.format("%30s %s\n", format, sdf.format(new Date(0)));
 }

这是我的OpenDialog功能的代码:

LPCTSTR getFilePath = NULL;

这就是将代码复制到编辑框中的代码,我想要它去:

int CTestClassDlg::OpenDialogBox(){

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))
    {
        // Show the Open dialog box.
        hr = pFileOpen->Show(NULL);

        // 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))
                {
                    getFilePath = pszFilePath;      //saves file path to global variable
                    CoTaskMemFree(pszFilePath);

                }
                pItem->Release();
            }
        }
        pFileOpen->Release();
    }
    CoUninitialize();
}
return 0;     }

虽然这会将正确的完整路径复制到编辑框中,但它要么完全省略驱动器号,要么只是放置一个看似随机的符号而不是它。

我不知道这个问题的原因是什么,搜索谷歌或在这里也没有带来任何有用的东西。

希望你们可以帮助我,因为我猜想一旦找到错误来源就应该很容易解决。

提前致谢!

0 个答案:

没有答案