从托管代码中的shell获取Vista / Windows Search / propsys.dll属性

时间:2008-12-06 02:10:50

标签: windows com com-interop shell32

有没有人设法做到这一点?我尝试为IPropertyStore创建一个托管包装类,但是在方法(即IPropertyStore :: GetValue)上获取了一个指向PROPVARIANT的指针的AccessViolationExceptions(在我的托管版本中呈现为MarshalAs(UnmanagedType.Struct)输出参数)可能是我的理解COM和interop是不合适的---我不确定问题是否在我的PROPVARIANT结构声明中(当前只使用StructLayout.Sequential,声明一个字节序列,并手动操作字节以获取各种类型的值)联盟等),COM问题是什么过程拥有什么,或其他东西。我已经尝试了各种其他版本的PROPVARIANT,例如对工会使用StructLayout.Explicit,没有任何效果。使用IPropertyStore检索PROPERTYKEY :: GetAt ---它本身被声明为获取指向PROPERTYKEY的指针,并且在我的包装器中具有我自己的StructLayout.Sequential PROPERTYKEY的out参数 - 顺便说一句,工作正常。

2 个答案:

答案 0 :(得分: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
}

这些定义将帮助您确保您的结构至少是正确的。至于你的其他问题,我没有答案。

答案 1 :(得分:1)

你应该看看http://code.msdn.microsoft.com/WindowsAPICodePack。它支持使用Windows Property System和一堆其他Windows shell功能。我认为这正是你要找的。