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を愛用