potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# IShellFolder::GetAttributesOfの定義時の注意

  • IShellFolder::GetAttributesOfの最後の引数はマスクにも使われるので戻り値に移動できない。

C#でWin32 APIIShellFolder::GetAttributesOfメソッドを利用する場合は戻り値をvoid(エラーを手動処理する場合はint)型にします。他のメソッドのように最後の引数を戻り値にすると、マスクを与えられずに戻り値が想定外(主に0)となります。

例外処理を自動化して複数のIDリストを渡す場合。

void GetAttributesOf(
    uint cidl,
    [In][MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
    ref SFGAOF rgfInOut);

例外処理を自動化して1つのIDリストしか渡さない場合。

void GetAttributesOf(
    uint cidl,
    ref IntPtr apidl,
    ref SFGAOF rgfInOut);

上記のコードでは以下の点に注意しています。

  • GetAttributesOfの最後の引数は入力がマスクとして利用される。次の定義を使うとマスクが常に0となり、戻り値も常に0になる。
SFGAOF GetAttributesOf(
    uint cidl,
    ref IntPtr apidl);
  • IntPtr[]MarshalAs(UnmanagedType.LPArray)でC形式の配列であることを知らせる。省略時はSAFEARRAY扱いされて異常なデータが渡される。