1

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

4

2 回答 2

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
}

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

于 2008-12-06T03:00:24.897 回答
1

您应该查看http://code.msdn.microsoft.com/WindowsAPICodePack。它支持使用 Windows 属性系统,以及许多其他 Windows shell 功能。我认为这正是您正在寻找的。

于 2010-07-13T01:35:17.980 回答