Ottenere le proprietà Vista / Windows Search / propsys.dll dalla shell nel codice gestito
-
19-08-2019 - |
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.
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.