パスワードを忘れた? アカウント作成
573972 journal

uhyorinの日記: コモンダイアログの初期ディレクトリ

日記 by 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()を使用)に戻すか…。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...