BytePtr型がいまいち理解できていないので、とりあえず戻り値はString型でやってます。
BytePtrってmalloc関数使わないと文字入れられないのか思ってたけど、そうでもないのね。
一応動きますが、直せる方がいらっしゃいましたら直してください。
[ここをクリックすると内容が表示されます]
Flagsのオプション的なのを拾ってきました。
とりあえず、これだけあれば使えるかなぁ・・・って感じです。コード: 全て選択
関数名は適当です。
hWnd→オーナーウインドウのハンドル
DialogName→ダイアログに表示するタイトル的な奴
Flags→オプションフラグ。0を指定すると、とりあえず動作するフラグが入ります。
Root→ルートフォルダの指定。ここで指定したフォルダー以下が表示されます。0でマイコン
戻り値→取得したフォルダーパスが返ります
[ここをクリックすると内容が表示されます]
0x0001
ファイルシステムディレクトリのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。
0x0002
ダイアログボックスのツリービューコントロールにドメインレベルのネットワークフォルダを含めないようにします。
0x0004
ダイアログボックスにステータス領域を表示します。表示テキストを設定するには、コールバック関数からダイアログボックスにメッセージを送信します。
0x0008
シェルネームスペース階層構造の中でルートフォルダの下にあるファイルシステムサブフォルダのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。
0x4000
フォルダとファイルを表示します。
ファイルシステムディレクトリのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。
0x0002
ダイアログボックスのツリービューコントロールにドメインレベルのネットワークフォルダを含めないようにします。
0x0004
ダイアログボックスにステータス領域を表示します。表示テキストを設定するには、コールバック関数からダイアログボックスにメッセージを送信します。
0x0008
シェルネームスペース階層構造の中でルートフォルダの下にあるファイルシステムサブフォルダのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。
0x4000
フォルダとファイルを表示します。
コード: 全て選択
Function SelectFolderPath(hWnd As HWND,DialogName As BytePtr,Flags As Long,Root As Long) As String
Dim bor As BROWSEINFO
Dim path[1025] As Byte
Dim id As Long
Dim str As String
Dim text As String
If DialogName="" Then
DialogName="フォルダーの選択"
End If
If Flags=0 Then
Flags=BIF_DONTGOBELOWDOMAIN or &H1
End If
If Root=0 Then
Root=&H0
End If
With bor
.hwndOwner=hMainWnd
.lpszTitle=DialogName
.ulFlags=Flags
.pidlRoot=Root
End With
id=SHBrowseForFolder(bor)
If id=FALSE Then
Exit Function
End If
SHGetPathFromIDList(id,path)
text=MakeStr(path)
free(path)
str=Right$(text,1)
If str<>"\" Then
text=text+"\"
End If
SelectFolderPath=text
End Function
後は適当に調べてください~
蛇足ですが、
SHBrowseForFolder関数で返って来る数値でファイルパスが決まるとは思ってもいなかった。
SHGetPathFromIDList関数はどうやって識別しているのか謎。
まあ、今の自分には理解できない事でしょうが・・・
良かったら使ってみてください~
重複あったらすいません。