public bool ShowDialog(IntPtr ownerWindow) { // オーナーウィンドウを正規化する ownerWindow = GetSafeOwnerWindow(ownerWindow); // ダイアログインターフェースを構築 IFileOpenDialog dlg = new FileOpenDialog() as IFileOpenDialog; // IUnknown::QueryInterfaceを使ってインターフェースを特定する try { // フォルダ選択モードに切り替え dlg.SetOptions(FOS.FORCEFILESYSTEM | FOS.PICKFOLDERS); // 以前選択されていたフォルダを指定 bool setFolder = false; IShellItem item = CreateItem(SelectedPath); if (item != null) { dlg.SetFolder(item); Marshal.ReleaseComObject(item); setFolder = true; } // まだフォルダを設定していない場合は初期フォルダを設定する if (!setFolder) { item = CreateItem(InitialFolder); if (item != null) { dlg.SetFolder(item); Marshal.ReleaseComObject(item); } } // タイトル if (!string.IsNullOrWhiteSpace(Title)) { dlg.SetTitle(Title); } // ショートカット追加 foreach (var place in m_places) { item = CreateItem(place.folder); if (item != null) { dlg.AddPlace(item, place.fdap); Marshal.ReleaseComObject(item); } } // ダイアログを表示 var hRes = dlg.Show(ownerWindow); if (NativeMethods.SUCCEEDED(hRes)) { item = dlg.GetResult(); SelectedPath = item.GetName(SIGDN.FILESYSPATH); Marshal.ReleaseComObject(item); return(true); } } finally { Marshal.ReleaseComObject(dlg); } return(false); }