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

有没有人设法做到这一点? 我试着做一个IPropertyStore的托pipe封装类,但获取方法(即IPropertyStore :: GetValue),需要一个指向PROPVARIANT(在我的托pipe版本呈现为一个MarshalAs(UnmanagedType.Struct)输出参数)的AccessViolationExceptions可能我的理解COM和interop是不够的—我不知道如果问题是在我的PROPVARIANT结构声明(它当前只是使用StructLayout.Sequential,声明一个字节序列,并手动操纵字节来获取各种types的值工会等),COM问题与什么进程拥有什么,或别的什么。 我已经尝试了各种其他版本的PROPVARIANT,如使用StructLayout.Explicit为工会,没有任何工作。 检索PROPERTYKEY与IPropertyStore :: GetAt —这是本机声明为指向PROPERTYKEY和具有我自己的StructLayout.Exclusive PROPERTYKEY在我的包装的出参数—顺便说一句,工作得很好。

你应该检查出http://code.msdn.microsoft.com/WindowsAPICodePack 。 它支持使用Windows属性系统,以及其他一些Windows Shell功能。 我想这正是你在找什么。

那么,这里是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 } 

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