Obtention des propriétés Vista / Windows Search / propsys.dll à partir du shell en code managé

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

Question

Quelqu'un a-t-il réussi à le faire? J'ai essayé de créer une classe d'encapsuleur managée pour IPropertyStore, mais j'obtiens AccessViolationExceptions sur les méthodes (c.-à-d. IPropertyStore :: GetValue) qui prennent un pointeur sur PROPVARIANT (restitué sous la forme d'un paramètre out de MarshalAs (UnmanagedType.Struct) dans ma version gérée). COM et interop est inadéquat - je ne suis pas sûr que les problèmes se trouvent dans ma déclaration de structure PROPVARIANT (qui utilise actuellement uniquement StructLayout.Sequential, déclare une séquence d'octets et manipule manuellement les octets pour obtenir les valeurs des différents types dans le syndicat, etc.), les problèmes de COM avec quel processus appartient quoi ou autre chose. J'ai essayé diverses autres versions du PROPVARIANT, telles que l'utilisation de StructLayout.Explicitement pour les syndicats, rien n'a fonctionné. Récupérer des PROPERTYKEY avec IPropertyStore :: GetAt ---, qui est déclaré nativement comme prenant un pointeur sur PROPERTYKEY et comme ayant un paramètre de sortie de mon propre StructLayout.Sequential, PROPERTYKEY dans mon wrapper --- fonctionne parfaitement, en passant.

Était-ce utile?

La solution

Vous devriez consulter http://code.msdn.microsoft.com/WindowsAPICodePack . . Il prend en charge l'utilisation de Windows Property System et de nombreuses autres fonctionnalités du shell Windows. Je pense que c'est exactement ce que vous recherchez.

Autres conseils

Eh bien, voici la version de MS.Internal.Interop (une mine de connaissances):

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

Ces définitions vous aideront à vous assurer que vos structures sont au moins correctes. Quant à vos autres problèmes, je n’ai pas de réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top