Obtener propiedades de Vista / Windows Search / propsys.dll del shell en el código administrado

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

Pregunta

¿Alguien ha logrado hacer esto? Intenté crear una clase de contenedor administrado para IPropertyStore pero obtengo AccessViolationExceptions en los métodos (es decir, IPropertyStore :: GetValue) que llevan un puntero a PROPVARIANT (representado como un parámetro MarshalAs (UnmanagedType.Struct) en mi versión administrada) Probablemente mi comprensión de COM e interoperabilidad son inadecuados --- No estoy seguro de si los problemas están en mi declaración de estructura PROPVARIANT (que actualmente solo usa StructLayout.Sequential, declara una secuencia de bytes y manipula manualmente los bytes para obtener valores de los distintos tipos en la unión, etc.), COM emite con qué proceso posee qué u otra cosa. He probado varias otras versiones de PROPVARIANT, como el uso de StructLayout. Explícito para los sindicatos, nada ha funcionado. Recuperar PROPERTYKEYs con IPropertyStore :: GetAt --- que se declara de forma nativa como tomar un puntero a PROPERTYKEY y tener un parámetro out de mi propio StructLayout.Sequential PROPERTYKEY en mi contenedor --- funciona muy bien, por cierto.

¿Fue útil?

Solución

Debería consultar http://code.msdn.microsoft.com/WindowsAPICodePack . Tiene soporte para consumir el sistema de propiedades de Windows y muchas otras capacidades de shell de Windows. Creo que es exactamente lo que estás buscando.

Otros consejos

Bueno, aquí está la versión de MS.Internal.Interop (un tesoro de conocimiento):

[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 definiciones lo ayudarán a asegurarse de que sus estructuras sean al menos correctas. En cuanto a sus otros problemas, no tengo una respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top