マネージコードのシェルからVista / Windows Search / propsys.dllプロパティを取得する
-
19-08-2019 - |
質問
これを実行できた人はいますか? IPropertyStoreのマネージラッパークラスを作成しようとしましたが、PROPVARIANT(MarshalAs(UnmanagedType.Struct)outパラメーターとしてマネージバージョンでレンダリングされる)へのポインターを取るメソッド(つまりIPropertyStore :: GetValue)でAccessViolationExceptionsを取得していますCOMと相互運用性が不十分---問題がPROPVARIANT構造体宣言にあるかどうかわかりません(現在はStructLayout.Sequentialを使用し、バイトシーケンスを宣言し、バイトを手動で操作してさまざまな型の値を取得します)ユニオンなど)、COMはどのプロセスが何を所有しているか、または何か他のものを発行します。組合にStructLayout.Explicitを使用するなど、PROPVARIANTの他のさまざまなバージョンを試しましたが、何も機能しませんでした。 IPropertyStore :: GetAtでPROPERTYKEYを取得---これは、PROPERTYKEYへのポインターを取得し、ラッパーに独自のStructLayout.Sequential PROPERTYKEYのoutパラメーターを持っているとネイティブに宣言されています---ちなみに、正常に動作します。
解決
http://code.msdn.microsoft.com/WindowsAPICodePack をチェックアウトする必要があります。 。 Windows Property Systemの使用をサポートし、他の多くのWindowsシェル機能を備えています。まさにあなたが探しているものだと思います。
他のヒント
まあ、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
}
これらの定義は、構造が少なくとも正しいことを確認するのに役立ちます。他の問題については、答えがありません。