c++ - 在 Windows XP 上替换::SHCreateItemFromParsingName()

标签 c++ windows winapi

我有一个需要在 XP 上运行的应用程序,但我希望能够调用::SHCreateItemFromParsingName(),它只能从 Vista 开始使用。

这个: http://social.msdn.microsoft.com/Forums/vstudio/en-US/04eab1a9-5024-4199-b66c-8d20a83d4af4/shcreateitemfromparsingname-analog-on-xp?forum=vcgeneral

说:

I believe you could achieve the same effect as follows: SHParseDisplayName to obtain item PIDL, then SHGetDesktopFolder, and finally IShellFolder::BindToObject

我尝试过的:

IFileDialog *pfd;
....
PIDLIST_ABSOLUTE pidl;
HRESULT hresult = ::SHParseDisplayName(m_path, 0, &pidl, SFGAO_FOLDER, 0);
if (SUCCEEDED(hresult))
{
  IShellFolder *psf;
  hresult = ::SHGetDesktopFolder(&psf);

  if (SUCCEEDED(hresult))
  {
    IShellItem *child;
    hresult = psf->BindToObject(pidl, 0, IID_IShellFolder, (void**)&child);
    if (SUCCEEDED(hresult))
    {
      pfd->SetFolder(child);
    }
  }
}

我认为我主要是在与 BindToObject 作斗争(因为我不是一个特别熟练的 Windows 程序员!)

这是否正确?

最佳答案

根据@Raymond Chen 的评论,这似乎是一个有效的替代品。

PIDLIST_ABSOLUTE pidl;
HRESULT hresult = ::SHParseDisplayName(m_path, 0, &pidl, SFGAO_FOLDER, 0);
if (SUCCEEDED(hresult))
{
  IShellItem *psi;
  hresult = ::SHCreateShellItem(NULL, NULL, pidl, &psi);
  if (SUCCEEDED(hresult))
  {
    pfd->SetFolder(psi);
  }
  ILFree(pidl);
}

关于c++ - 在 Windows XP 上替换::SHCreateItemFromParsingName(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885556/

相关文章:

c++ - 在输出窗口中显示三个图像而不是一个

c# - 从代码调用悬停预览

c++ - 使用绝对路径加载带有 LoadLibrary() 和 GetModuleHandle() 的系统 DLL 是否能更好地防止 DLL 劫持?

c++ - 如何使用 CreateProcess 将输出重定向到文件?

c# - 从 SysListView32 获取项目文本

c++ - 如何在此环境中设置 deadline_timer?

c++ - 自复制文件到新位置 tchar 与 char 不兼容

c++ - C 和 C++ 标准是否暗示地址空间中的特殊值必须仅存在以表示空指针的值?

windows - 如何将具有不同扩展名的文件作为 BAT 文件运行

windows - 在运行时编辑 PowerShell 脚本