マネージコードのシェルからVista / Windows Search / propsys.dllプロパティを取得する

StackOverflow https://stackoverflow.com/questions/345766

質問

これを実行できた人はいますか? 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
}

これらの定義は、構造が少なくとも正しいことを確認するのに役立ちます。他の問題については、答えがありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top