/// <summary> /// 変数などを初期化する。 /// </summary> private static void Initialize() { m_bInitialized = true; ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGFI dwAttribs = ShellAPI.SHGFI.SHGFI_USEFILEATTRIBUTES | ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX; m_himlSmall = ShellAPI.SHGetFileInfoW(".txt", ShellAPI.FILE_ATTRIBUTE_NORMAL, out shInfo, (uint)Marshal.SizeOf(shInfo), dwAttribs); if (m_himlSmall.Equals(IntPtr.Zero)) { throw new Exception("小システムイメージリストを取得できませんでした。"); } dwAttribs = ShellAPI.SHGFI.SHGFI_USEFILEATTRIBUTES | ShellAPI.SHGFI.SHGFI_LARGEICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX; m_himlLarge = ShellAPI.SHGetFileInfoW(".txt", ShellAPI.FILE_ATTRIBUTE_NORMAL, out shInfo, (uint)Marshal.SizeOf(shInfo), dwAttribs); if (m_himlLarge.Equals(IntPtr.Zero)) { throw new Exception("大システムイメージリストを取得できませんでした。"); } }
/// <summary> /// 属性を初期化する。 /// </summary> private void InitAtr(InitMode mode, IntPtr pIDL, ShellAPI.IShellFolder parentSf) { // 基本的な属性を初期化する ShellAPI.SFGAOF uFlags = 0; switch (mode) { case InitMode.Desktop: { this.IsFolder = true; this.IsFileSystem = false; this.HasSubFolder = true; } break; case InitMode.Path: case InitMode.Child: { uFlags = ShellAPI.SFGAOF.SFGAO_FOLDER | ShellAPI.SFGAOF.SFGAO_FILESYSTEM | ShellAPI.SFGAOF.SFGAO_FILESYSANCESTOR; parentSf.GetAttributesOf(1, out pIDL, out uFlags); this.IsFolder = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FOLDER); this.IsFileSystem = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FILESYSTEM); if (this.IsFolder) { // GetAttributesOf で SFGAO_HASSUBFOLDER を調べるとかなり遅くなる、 // そもそも this.HasSubFolder はヒントとして使用するだけなのでフォルダの場合は問答無用で // this.HasSubFolder に true をセットする this.HasSubFolder = true; // このオブジェクト用の IShellFolder インターフェース取得 m_ShellFolder = ShellAPI.BindToIShellFolder(parentSf, pIDL); } } break; } // パス名取得 m_Path = ShellAPI.SHGetPathFromIDList(m_pIDL); // アイコンインデックス番号とかの属性取得 ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfoW( m_pIDL, 0, out shInfo, (uint)Marshal.SizeOf(shInfo), ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX | ShellAPI.SHGFI.SHGFI_PIDL | ShellAPI.SHGFI.SHGFI_DISPLAYNAME | ShellAPI.SHGFI.SHGFI_TYPENAME ); m_DisplayName = shInfo.szDisplayName; m_TypeName = shInfo.szTypeName; m_iIconIndex = shInfo.iIcon; // 選択時のアイコンインデックス番号取得 ShellAPI.SHGetFileInfoW( m_pIDL, 0, out shInfo, (uint)Marshal.SizeOf(shInfo), ShellAPI.SHGFI.SHGFI_PIDL | ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX | ShellAPI.SHGFI.SHGFI_OPENICON ); m_iSelectedIconIndex = shInfo.iIcon; // いろいろ調べてアイテム種類(m_ItemType)を確定する if (this.IsFileSystem) { bool bValidated = false; m_FileName = ""; try { m_FileName = System.IO.Path.GetFileName(m_Path); if (this.IsFolder) { if (System.IO.Path.GetPathRoot(m_Path) == m_Path) { // パス名とルートパスが同じならドライブのはず m_ItemType = ShellItemType.Drive; bValidated = true; } else if (Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FILESYSANCESTOR)) { // ファイルシステムアイテムを含むことができるフォルダ=ファイルフォルダ(だと思う) m_ItemType = ShellItemType.Folder; bValidated = true; } } } catch { // システムのアイテムの場合まともなパス名ではなくて、例外が出ちゃうので // ここで例外キャッチ } if (!bValidated) { m_ItemType = ShellItemType.File; bValidated = true; } } else { if (this.IsFolder) { m_ItemType = ShellItemType.SpecialFolder; } else { m_ItemType = ShellItemType.SpecialItem; } } }