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

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

Ответы [ 2 ]

1 голос
/ 13 июля 2010

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

1 голос
/ 06 декабря 2008

Ну, вот версия из 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
}

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

...