ページ 11

ダイアログボックスの複数選択

Posted: 2006年10月23日(月) 11:08
by ジョン
よろしくお願いします。
選択したファイルが1つの場合は「lpstrFile」にフルパスが格納
されているようですが、複数選択したそれぞれのファイルのフルパスは
下記のコードではうまくメッセージボックスでそれぞれ表示されません。
目的は表示そのものではなく、選択した複数のファイルを任意の場所に
読み書きしたいのですが、この段階でつまずいています。


'OPENFILENAME構造体の初期化
Dim ofn As OPENFILENAME
Dim FileName[MAX_PATH] As Byte,FN1[MAX_PATH] As Byte

FillMemory(VarPtr(ofn),Len(ofn),0)
ofn.lpstrInitialDir="D:"
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=hMainWnd
ofn.lpstrFilter=Ex" 全てのデータ\0*.*\0\0"
ofn.nFilterIndex=1
ofn.lpstrFile=FileName
ofn.nMaxFile=MAX_PATH
ofn.lpstrTitle="ファイルの選択"
ofn.Flags=OFN_ALLOWMULTISELECT OR OFN_OVERWRITEPROMPT or OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
ofn.lpstrDefExt="*"

'「ファイルの選択」ダイアログ ボックスを表示
If GetOpenFileName(ofn)=0 Then Exit Sub
MessageBox(0,FileName,"",MB_OK)

Re: ダイアログボックスの複数選択

Posted: 2006年10月23日(月) 18:47
by 7
> 選択したファイルが1つの場合は「lpstrFile」にフルパスが格納
> されているようですが、複数選択したそれぞれのファイルのフルパスは
> 下記のコードではうまくメッセージボックスでそれぞれ表示されません。
OFN_EXPLORERフラグが設定されている場合、それぞれNULL文字で区切られ、連続したNULL文字で終わります。
ということです。
ということはファイル名(複数)は以下のような文字列になっているんじゃないでしょうか。

コード: 全て選択

"C:\hoge\hoge.exe\0C:\pika\pika.exe\0E:\foo\foo.exe\0\0"
これをそれぞれ取り出すと。

さてどうやって取り出したものか...。

GetLogicalDriveStrings()という関数で取得できるドライブ名の文字列も前掲した通りで、昔はそれをちゃんと取り出してたんですけど、やり方忘れてしまいました...。

Re: ダイアログボックスの複数選択

Posted: 2006年10月23日(月) 20:24
by hira
こういう感じで取り出してみてはいかがでしょう。(FileNameに複数のファイル名が入っているとする)

コード: 全て選択

Dim p As *Byte
p=FileName
While p[0]<>0
	'ここでpはファイル名の1つを示す。
	MessageBox(0,p,"",MB_OK) '例

	'次のファイル名
	p=p+lstrlen(p)+1
Wend