Ottenere le proprietà Vista / Windows Search / propsys.dll dalla shell nel codice gestito

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

Domanda

Qualcuno è riuscito a farlo? Ho provato a creare una classe wrapper gestita per IPropertyStore ma sto ottenendo AccessViolationExceptions sui metodi (ovvero IPropertyStore :: GetValue) che portano un puntatore a PROPVARIANT (reso come un parametro MarshalAs (UnmanagedType.Struct) nella mia versione gestita) Probabilmente la mia comprensione di COM e interop sono inadeguati --- Non sono sicuro se i problemi siano nella mia dichiarazione di struttura PROPVARIANT (che attualmente utilizza solo StructLayout.Sequential, dichiara una sequenza di byte e manipola manualmente i byte per ottenere valori dei vari tipi in il sindacato ecc.), la COM si preoccupa di quale processo possiede cosa o qualcos'altro. Ho provato varie altre versioni di PROPVARIANT come usare StructLayout.Explicit per i sindacati, niente ha funzionato. Recuperare PROPERTYKEYs con IPropertyStore :: GetAt --- che viene dichiarato nativamente come prendere un puntatore a PROPERTYKEY e avere un parametro out del mio StructLayout.Sequential PROPERTYKEY nel mio wrapper --- funziona bene, comunque.

È stato utile?

Soluzione

Dovresti dare un'occhiata a http://code.msdn.microsoft.com/WindowsAPICodePack . Ha il supporto per l'utilizzo del sistema di proprietà di Windows e un sacco di altre funzionalità della shell di Windows. Penso che sia esattamente quello che stai cercando.

Altri suggerimenti

Bene, ecco la versione da MS.Internal.Interop (una conoscenza di conoscenza):

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

Queste definizioni ti aiuteranno ad assicurarti che le tue strutture siano almeno corrette. Per quanto riguarda i tuoi altri problemi, non ho una risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top