在Windows XP上替换:: SHCreateItemFromParsingName()

ste*_*eet 5 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

说过:

我相信你可以达到如下效果:SHParseDisplayName获取项目PIDL,然后SHGetDesktopFolder,最后是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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这甚至是模糊的吗?

ste*_*eet 6

基于@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);
}
Run Code Online (Sandbox Code Playgroud)