Я пишу обработчик свойства, который предоставляет строковое значение для столбца в Windows Explorer. я хочу расширить обработчик для отображения значков вместо строк.
Первый шаг моего подхода - указать XML для свойства в файле .propdes c, а затем go через Обычный PSRegisterPropertySchema процесс регистрации. Это всегда выполняется успешно, и свойство указано в Windows Системе свойств.
Но, к сожалению, пока я не добился успеха, мне нужна помощь.
Заранее спасибо
Это мой .propdes c файл:
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.microsoft.com/windows/2006/propertydescription"
schemaVersion="1.0" >
<propertyDescriptionList publisher="Peyman" product="PeymanNse">
<propertyDescription name="Peyman.IconUI" formatID="{46380AB0-BF18-4B6B-87F3-F85E5D4DCCE6}" propID="3">
<searchInfo reIndexPatterns="" processReIndexPatternsImmediately="true" inInvertedIndex="false" isColumn="false">
</searchInfo>
<typeInfo type="Blob" isInnate="true" isViewable="true">
</typeInfo>
<labelInfo label="Icon UI">
</labelInfo>
<displayInfo defaultColumnWidth="10">
<drawControl control="IconList">
</drawControl>
</displayInfo>
</propertyDescription>
<propertyDescription name="Peyman.Icon" formatID="{46380AB0-BF18-4B6B-87F3-F85E5D4DCCE6}" propID="4">
<searchInfo reIndexPatterns="" processReIndexPatternsImmediately="true" inInvertedIndex="false" isColumn="false">
</searchInfo>
<typeInfo type="UInt32" isInnate="true" groupingRange="Enumerated" isViewable="true">
</typeInfo>
<displayInfo displayType="Enumerated">
<enumeratedList>
<enum name="None" value="0" text="">
</enum>
<enum name="Ok" value="1" text="Ok">
<image res="%systemroot%\system32\imageres.dll,-1405">
</image>
</enum>
<enum name="Error" value="2" text="Error">
<image res="%systemroot%\system32\imageres.dll,-1402">
</image>
</enum>
<enum name="Warning" value="3" text="Warning">
<image res="%systemroot%\system32\imageres.dll,-1403">
</image>
</enum>
</enumeratedList>
</displayInfo>
<labelInfo label="Icon">
</labelInfo>
</propertyDescription>
</propertyDescriptionList>
</schema>
и IPropertyStore :: GetValue код:
HRESULT MigRavenNseFolder::GetValue(const PROPERTYKEY& key, PROPVARIANT* pv)
{
auto hr = E_NOTIMPL;
if (IsEqualPropertyKey(key, PKEY_Peyman_IconUI))
{
PROPVARIANT propStatusIcons;
PropVariantInit(&propStatusIcons);
PROPVARIANT propDisplayFlag;
PropVariantInit(&propDisplayFlag);
PROPVARIANT propEnumIcons;
PropVariantInit(&propEnumIcons);
CComPtr<IPropertyStore> ps;
CComPtr<IPersistStream> pstream;
CComPtr<IStream> stream;
PSCreateMemoryPropertyStore(IID_PPV_ARGS(&ps));
InitPropVariantFromString(L"prop:Peyman.Icon", &propStatusIcons);
InitPropVariantFromUInt32(2, &propDisplayFlag);
InitPropVariantFromUInt32(3, &propEnumIcons);
ps->SetValue(PKEY_PropList_StatusIcons, propStatusIcons);
ps->SetValue(PKEY_PropList_StatusIconsDisplayFlag, propDisplayFlag);
ps->SetValue(PKEY_Migraven_IconEnumList, propEnumIcons);
ps->QueryInterface(&pstream);
hr = pstream->Save(stream, TRUE);
ULARGE_INTEGER* cbSize;
IStream_Size(stream, cbSize);
auto pb = static_cast<BYTE*>(CoTaskMemAlloc(cbSize->LowPart));
CopyMemory(pb, stream, cbSize->LowPart);
pv->vt = VT_BLOB;
pv->blob.cbSize = cbSize->LowPart;
pv->blob.pBlobData = pb;
PropVariantClear(&propStatusIcons);
PropVariantClear(&propDisplayFlag);
PropVariantClear(&propEnumIcons);
}
return S_OK;
}