gpt4 book ai didi

visual-c++ - 如何在 COM 中获取可执行文件的安装应用程序路径

转载 作者:行者123 更新时间:2023-12-04 06:36:58 24 4
gpt4 key购买 nike

我正在尝试使用 COM 获取所有应用程序的安装位置。我能够获得每个应用程序的显示名称。但是我无法获得每个应用程序的安装路径。

我的代码:

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;
}

知道如何从 IEnumShellItems 获取安装路径。

感谢广告。

最佳答案

这是一段将转储出来的代码。 child 的IPropertyStore没有返回这些,不知道为什么,只好用旧的
IShellFolder2::GetDetailsEx method具有特殊的列 id(与 PROPERTYKEY 相同)。

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);
}
}

请注意,它使用的是未记录的 System.Software.InstallLocation属性(property) key 。为了找到它,我只是为每个 child 用这样的代码转储了所有列:
    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);
}

PS:我没有添加太多错误检查,但你应该这样做。

关于visual-c++ - 如何在 COM 中获取可执行文件的安装应用程序路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47513509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com