我有一个需要在 XP 上运行的应用程序,但我希望能够调用::SHCreateItemFromParsingName(),它只能从 Vista 开始使用。
说:
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/