Obtendo propriedades Vista / Windows Search / propsys.dll do shell em código gerenciado

StackOverflow https://stackoverflow.com/questions/345766

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top