Obtendo propriedades Vista / Windows Search / propsys.dll do shell em código gerenciado
-
19-08-2019 - |
Pergunta
Alguém já conseguiu fazer isso? Eu tentei fazer uma classe wrapper gerenciado para IPropertyStore mas estou recebendo AccessViolationExceptions sobre os métodos (ou seja IPropertyStore :: GetValue) que levam um ponteiro para PROPVARIANT (processado como um MarshalAs (UnmanagedType.Struct) fora de parâmetro na minha versão gerenciado) Provavelmente o meu entendimento do cOM e interoperabilidade é insuficiente --- Eu não tenho certeza se os problemas estão na minha declaração PROPVARIANT struct (que atualmente só usa StructLayout.Sequential, declara uma seqüência de bytes, e manipula manualmente os bytes para obter os valores dos vários tipos de a união etc.), questões cOM com o processo possui o quê, ou qualquer outra coisa. Eu tentei várias outras versões do PROPVARIANT como o uso de StructLayout.Explicit para os sindicatos, nada funcionou. Recuperando PROPERTYKEYs com IPropertyStore :: GetAt --- que é declarado nativamente como tomar um ponteiro para PROPERTYKEY e como tendo um parâmetro fora do meu próprio StructLayout.Sequential PROPERTYKEY no meu invólucro --- funciona muito bem, por sinal.
Solução
Você deve verificar se http://code.msdn.microsoft.com/WindowsAPICodePack . Tem suporte para consumir o Sistema de Propriedade do Windows, e um monte de outras janelas desembolsar capacidades. Eu acho que é exatamente o que você está procurando.
Outras dicas
Bem, aqui está a versão de MS.Internal.Interop
(um tesouro de conhecimento):
[StructLayout(LayoutKind.Sequential), FriendAccessAllowed]
internal struct PROPVARIANT
{
internal VARTYPE vt;
internal ushort wReserved1;
internal ushort wReserved2;
internal ushort wReserved3;
internal PropVariantUnion union;
}
[FriendAccessAllowed]
internal enum VARTYPE : short
{
VT_BSTR = 8,
VT_FILETIME = 0x40,
VT_LPSTR = 30,
// etc...
}
[StructLayout(LayoutKind.Explicit), FriendAccessAllowed]
internal struct PropVariantUnion
{
[FieldOffset(0)]
internal BLOB blob;
[FieldOffset(0)]
internal short boolVal;
// etc... see MS.Internal.Interop for full definition
}
Estas definições irão ajudá-lo a certificar-se de suas estruturas são pelo menos correta. Quanto aos seus outros problemas, eu não tenho uma resposta.