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