有没有人设法做到这一点?我尝试为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参数 - 顺便说一句,工作正常。
答案 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功能。我认为这正是你要找的。 p>