2008-12-06 2 views
1

Неужели кому-нибудь удалось это сделать? Я попытался создать класс управляемых оболочек для IPropertyStore, но получаю AccessViolationExceptions для методов (например, IPropertyStore :: GetValue), которые берут указатель на PROPVARIANT (отображаемый как параметр MarshalAs (UnmanagedType.Struct) в моей управляемой версии). Возможно, мое понимание COM и interop неадекватны --- Я не уверен, что проблемы в моем объявлении структуры PROPVARIANT (который в настоящее время просто использует StructLayout.Sequential, объявляет последовательность байтов и вручную манипулирует байтами для получения значений различных типов в профсоюз и т. д.), проблемы COM с каким процессом принадлежит то, что или что-то еще. Я пробовал другие версии PROPVARIANT, такие как использование StructLayout.Explicit для профсоюзов, ничего не сработало. Получение PROPERTYKEYs с помощью IPropertyStore :: GetAt ---, который объявлен изначально как принимающий указатель на PROPERTYKEY и имеющий параметр out из моего собственного StructLayout.Sequential PROPERTYKEY в моей обертке --- отлично работает, кстати.Получение свойств Vista/Windows Search/propsys.dll из оболочки в управляемом коде

ответ

1

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

+0

К сожалению, этого не было, когда я изначально спросил, но это определенно путь. – 2010-07-14 23:07:39

1

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

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