Получение свойств Vista / Windows Search / propsys.dll из оболочки в управляемом коде

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

Вопрос

Кому-нибудь удалось это сделать? Я пытался создать управляемый класс-оболочку для IPropertyStore, но получаю AccessViolationException для методов (например, IPropertyStore :: GetValue), которые принимают указатель на параметр PROPVARIANT (отображается как параметр MarshalAs (UnmanagedType.Struct) в моей управляемой версии). Вероятно, мое понимание COM и взаимодействие неадекватны - я не уверен, есть ли проблемы в моем объявлении структуры PROPVARIANT (которое в настоящее время просто использует StructLayout.Sequential, объявляет последовательность байтов и вручную манипулирует байтами, чтобы получить значения различных типов в союз и т. д.), СОМ задает вопрос, какому процессу принадлежит что-либо или что-то еще. Я пробовал различные другие версии PROPVARIANT, такие как использование StructLayout.Explicit для профсоюзов, ничего не получалось. Получение PROPERTYKEYs с помощью IPropertyStore :: GetAt ---, который изначально объявлен как принимающий указатель на PROPERTYKEY и имеющий параметр out моего собственного StructLayout.Sequential PROPERTYKEY в моей оболочке --- работает, кстати, просто отлично.

Это было полезно?

Решение

Вам следует проверить http://code.msdn.microsoft.com/WindowsAPICodePack , Он поддерживает использование Windows Property System и множество других возможностей оболочки Windows. Я думаю, что это именно то, что вы ищете.

Другие советы

Хорошо, вот версия из MS.Internal.Interop (кладезь знаний):

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

Эти определения помогут вам убедиться, что ваши структуры, по крайней мере, верны. Что касается других ваших проблем, у меня нет ответа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top