IShellFolder で GetAttributesOf メソッドを呼び出すとエラーが発生する - C#

IShellFolder で GetAttributesOf メソッドを呼び出すとエラーが発生するTipsの紹介です。

エラーが起きるコード

ビルドは通りますが、GetAttributesOf()でエラーが発生します。
      hRes = ShellWindowsAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellWindowsAPI.CSIDL.CSIDL_DRIVES, ref m_pIDL);
      if (hRes != 0) Marshal.ThrowExceptionForHR(hRes);

      ShellWindowsAPI.IShellFolder ishf;
      uint hRes2 = m_shRootShell.BindToObject(m_pIDL, IntPtr.Zero, ref ShellWindowsAPI.IID_IShellFolder, out ishf);

      ShellWindowsAPI.SFGAOF uFlagsa = ShellWindowsAPI.SFGAOF.SFGAO_FOLDER | ShellWindowsAPI.SFGAOF.SFGAO_HASSUBFOLDER
      | ShellWindowsAPI.SFGAOF.SFGAO_STREAM | ShellWindowsAPI.SFGAOF.SFGAO_DROPTARGET;
      ishf.GetAttributesOf(1, new IntPtr[] { m_pIDL }, ref uFlagsa);

原因

IShellFolder でGetAttributesOfできる対象はIShellFolder自身より下位のフォルダに限られるようです。

下記のコードのように、IShellFolderのEnumObjects()メソッドを呼び出し、サブフォルダのPIDLであれば、GetAttributesOf()で属性を取得できます。
      ShellWindowsAPI.IEnumIDList pEnum = null;
      uint hRes3 = ishf.EnumObjects(IntPtr.Zero, ShellWindowsAPI.SHCONTF.SHCONTF_FOLDERS, out pEnum);
      if (hRes3 != 0) Marshal.ThrowExceptionForHR((int)hRes);

      IntPtr pIDL = IntPtr.Zero;
      Int32 iGot = 0;
      pEnum.Next(1, out pIDL, out iGot);

      while (!pIDL.Equals(IntPtr.Zero) && iGot == 1) {

        ShellWindowsAPI.SFGAOF uFlags = ShellWindowsAPI.SFGAOF.SFGAO_FOLDER | ShellWindowsAPI.SFGAOF.SFGAO_HASSUBFOLDER
        | ShellWindowsAPI.SFGAOF.SFGAO_STREAM | ShellWindowsAPI.SFGAOF.SFGAO_DROPTARGET;

        ishf.GetAttributesOf(1, new IntPtr[] { pIDL }, ref uFlags);
        System.Diagnostics.Debug.WriteLine(uFlags);

        Marshal.FreeCoTaskMem(pIDL);
        pIDL = IntPtr.Zero;
        iGot = 0;

        pEnum.Next(1, out pIDL, out iGot);
      }
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2015-06-04
iPentec all rights reserverd.