Visual c++ 如何在COM中获取executbale的安装应用程序路径
我正在尝试使用COM获取所有应用程序的安装位置。我能够获得每个应用程序的显示名称。但我无法获得每个应用程序的安装路径 我的代码:Visual c++ 如何在COM中获取executbale的安装应用程序路径,visual-c++,com,Visual C++,Com,我正在尝试使用COM获取所有应用程序的安装位置。我能够获得每个应用程序的显示名称。但我无法获得每个应用程序的安装路径 我的代码: CComPtr<IShellItem> spPrinters; CoInitialize(nullptr); HRESULT hresult = ::SHCreateItemFromParsingName(L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\8\\"
CComPtr<IShellItem> spPrinters;
CoInitialize(nullptr);
HRESULT hresult = ::SHCreateItemFromParsingName(L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\8\\"
L"::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}", nullptr, IID_PPV_ARGS(&spPrinters));
CComPtr<IEnumShellItems> spEnum;
spPrinters->BindToHandler(nullptr, BHID_EnumItems, IID_PPV_ARGS(&spEnum));
for (CComPtr<IShellItem> spProgram; spEnum->Next(1, &spProgram, nullptr) == S_OK; spProgram.Release())
{
CComHeapPtr<wchar_t> spszName;
spProgram->GetDisplayName(SIGDN_NORMALDISPLAY, &spszName);
CString cDisplayName = spszName;
}
CComPtr打印机;
共同初始化(nullptr);
HRESULT HRESULT=::SHCreateItemFromParsingName(L):{26EE0668-A00A-44D7-9371-BEB064C98683}\\8\\”
L“{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}”,空打印,IID_PPV_参数(&spPrinters));
首席执行官;
spPrinters->BindToHandler(nullptr、BHID_EnumItems、IID_PPV_ARGS(&spEnum));
对于(CComPtr spProgram;spEnum->Next(1,&spProgram,nullptr)==S_OK;spProgram.Release())
{
ccomheaptr-spszName;
spProgram->GetDisplayName(SIGDN_NORMALDISPLAY和spszName);
CString cDisplayName=spszName;
}
知道如何从IEnumShellItems获取安装路径吗
感谢您的支持。下面是一段代码,可以将其转储。孩子的IPropertyStore不返回这些,我不知道为什么,所以我们必须使用旧的 具有特殊列id(与PROPERTYKEY相同)
PS:我没有添加太多错误检查,但您应该添加。按安装路径,您是指(可选)“位置”列吗?是;我想知道位置。谢谢@Simon.:)我刚刚添加了CoInitialize(NULL);否则,SHCreateItemFromParsingName将返回NULL。不管怎样,我添加了错误检查,它对我来说很好。再次感谢。:)是的,大多数shell函数都需要COM初始化。@CrazyCoder,你应该在赏金到期之前接受这个答案
CComPtr<IShellItem> cpl;
CComPtr<IShellFolder2> folder;
CComPtr<IEnumShellItems> enumerator;
PROPERTYKEY pkLocation;
SHCreateItemFromParsingName(L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\8\\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}", nullptr, IID_PPV_ARGS(&cpl));
// bind to IShellFolder
cpl->BindToHandler(NULL, BHID_SFObject, IID_PPV_ARGS(&folder));
// bind to IEnumShellItems
cpl->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&enumerator));
// get this property key's value
PSGetPropertyKeyFromName(L"System.Software.InstallLocation", &pkLocation);
for (CComPtr<IShellItem> child; enumerator->Next(1, &child, nullptr) == S_OK; child.Release())
{
// get child's display name
CComHeapPtr<wchar_t> name;
child->GetDisplayName(SIGDN_NORMALDISPLAY, &name);
wprintf(L"%s\n", name);
// get child's PIDL
CComHeapPtr<ITEMIDLIST> pidl;
SHGetIDListFromObject(child, &pidl);
// the PIDL is absolute, we need the relative one (the last itemId in the list)
// get it's install location
CComVariant v;
if (SUCCEEDED(folder->GetDetailsEx(ILFindLastID(pidl), &pkLocation, &v)))
{
// it's a VT_BSTR
wprintf(L" %s\n", v.bstrVal);
}
}
int iCol = 0;
do
{
SHCOLUMNID colId;
if (FAILED(folder->MapColumnToSCID(iCol, &colId)))
break; // last column
CComHeapPtr<wchar_t> name;
PSGetNameFromPropertyKey(colId, &name);
CComVariant v;
if (SUCCEEDED(folder->GetDetailsEx(ILFindLastID(pidl), &colId, &v)))
{
if (v.vt == VT_BSTR)
{
wprintf(L" %s: %s\n", name, v.bstrVal);
}
else
{
wprintf(L" %s vt: %i\n", name, v.vt);
}
}
iCol++;
} while (true);
}