uhyorinの日記: コモンダイアログの初期ディレクトリ
Win32API GetSaveFileName() をコールすることで、「名前を付けて保存」コモンダイアログボックスを使用することができる。
このとき、OPENFILENAME構造体の引数 lpstrInitialDir にクラスIDらしきものを引数に与えることで、コモンダイアログボックスの左側に表示される「マイコンピュータ」や「デスクトップ」などを初期フォルダとして設定可能である。らしい。
VB6では、
---- API宣言
Public Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'pOpenFileName構造体(ユーザー定義型)の宣言
Public Type OPENFILENAME
lStructSize As Long '構造体のサイズ
hwndOwner As Long 'ダイアログを所有するウインドウハンドル
hInstance As Long 'アプリケーションインスタンス
lpstrFilter As String 'フィルタ
lpstrCustomFilter As Long 'ユーザ定義フィルタ
nMaxCustrFilter As Long 'ユーザ定義フィルタのバッファサイズ
nFilterIndex As Long 'デフォルトフィルタのインデックス
lpstrFile As String '選択されたファイル名
nMaxFile As Long 'ファイル名のバッファ
lpstrFileTitle As String '選択されたファイル名のタイトル
nMaxFileTitle As Long 'ファイル名のタイトルのバッファ
lpstrInitialDir As String '初期ディレクトリ
lpstrTitle As String 'ダイアログボックスのタイトル
Flags As Long 'オプション
nFileOffset As Integer 'ファイル名の最後の「\」までのオフセット値
nFileExtension As Integer '拡張子までのオフセット値
lpstrDefExt As String 'デフォルトの拡張子
lCustrData As Long 'OSがフック関数に渡すアプリ定義のデータ
lpfnHook As Long 'メッセージを処理するフック関数へのポインタ
lpTemplateName As Long
End Type
---- 関数とかサブルーチンとか
Dim strWork as String = * 512 'バイト型文字列長
(略
'バイト長文字列型にクラスIDらしきもの(この例ではデスクトップ)を代入、Nullを終端文字にセットする。
strWork = "::{00021400-0000-0000-C000-000000000046}" & vbNullChar
(略
With t_DLG
'初期設定フォルダにクラスIDらしきものを渡す。
.lpstrInitialDir = strWork
end with
'コモンダイアログボックスを開く。
lngRet = GetSaveFileName(t_DLG)
'キャンセルが押下されたときは、戻り値はゼロ。
If (lngRet = 0) Then
GoTo Exit_Rtn
End If
----
なんか見づらいけど、そのまま保存しておくか。
VB6だからコモンダイアログコントロールがあったりするけど、フォームにコントロールを貼り付けるのが面倒というかフォーム未使用のプログラムを作るときになったらこの手のAPIは避けて通れない…ですよね?(と同意を求めてみたり
よく使うのはこの3つくらいだろうか。Win2000で確認はしたが、XPでも動くか検証しなくちゃだわ。
マイコンピュータ:{20D04FE0-3AEA-1069-A2D8-08002B30309D}
マイドキュメント:{450D8FBA-AD25-11D0-98A8-0800361B1103}
デスクトップ:{00021400-0000-0000-C000-000000000046}
----
2005/04/22 0:05 追記:
クラスIDでデスクトップを指定すると、エクスプローラで参照しているカレントディレクトリが表示されるような気がする…。
----
2005/04/22 0:16 追記:
API ShellExecute()でエクスプローラにクラスIDを渡すことで、特殊パスが開ける。
下記の例だと、マイコンピュータを基点としてエクスプローラが立ち上がる。
call ShellExecute(lnghWnd, "open", "explorer.exe", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", vbNullChar, SW_SHOWNORMAL)
…が、デスクトップのクラスIDをセットすると、
「パス'::{00021400-0000-0000-C000-000000000046}'は存在しないか、ディレクトリではありません。」と表示されて終了~。
元の仕様(API SHGetSpecialFolderPath()を使用)に戻すか…。
コモンダイアログの初期ディレクトリ More ログイン