Получение свойств Vista / Windows Search / propsys.dll из оболочки в управляемом коде
-
19-08-2019 - |
Вопрос
Кому-нибудь удалось это сделать? Я пытался создать управляемый класс-оболочку для 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
}
Эти определения помогут вам убедиться, что ваши структуры, по крайней мере, верны. Что касается других ваших проблем, у меня нет ответа.