Как отобразить значок в windows столбце просмотра сведений о проводнике - PullRequest
0 голосов
/ 22 апреля 2020

Я пишу обработчик свойства, который предоставляет строковое значение для столбца в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...