- 題名: GetOpenFileNameで複数のファイル名を取得する方法
- 日時: 2007/05/01 17:56:11
- ID: 19644
- この記事の返信元:
- (なし)
- この記事への返信:
- [19645] Re[1]: GetOpenFileNameで複数のファイル名を取得する方法2007/05/01 18:35:06
- ツリーを表示
早速の回答ありがとうございます。 lpstrFile をIntPtr型に変更し、Char型配列(またはByte型配列)にセットしてから取り出してみたところ、 複数のファイル名を取得することができました。本当にありがとうございました。 変更したコードは以下の通りです。 Private Const FILENAMES_BYTES As Integer = 512 Public Function ShowDialog() As DialogResult Dim ofn As OPENFILENAME = Nothing Dim pFile As IntPtr = Marshal.StringToHGlobalUni(New String(vbNullChar, FILENAMES_BYTES)) Dim fList As New List(Of String) ofn.lStructSize = Marshal.SizeOf(ofn) ofn.lpstrFilter = "All Files(*.*)" & vbNullChar & "*.*" & vbNullChar & vbNullChar ofn.nFilterIndex = 1 ofn.lpstrFile = pFile ofn.nMaxFile = FILENAMES_BYTES ofn.lpstrFileTitle = New String(vbNullChar, FILENAMES_BYTES) ofn.nMaxFileTitle = ofn.lpstrFileTitle.Length ofn.hwndOwner = Form.ActiveForm.Handle ofn.Flags = OFN_EXPLORER Or OFN_HIDEREADONLY Or OFN_ALLOWMULTISELECT If GetOpenFileName(ofn) = 0 Then Marshal.FreeHGlobal(pFile) Return DialogResult.Cancel End If fList = GetFileList(pFile) Marshal.FreeHGlobal(pFile) If fList.Count >= 2 Then Dim i As Integer ReDim m_FileNames(fList.Count - 2) For i = 0 To fList.Count - 2 m_FileNames(i) = Path.Combine(fList(0), fList(i + 1)) Next Else m_FileNames = New String() {fList(0)} End If Return DialogResult.OK End Function Private Function GetFileList(ByVal p As IntPtr) As List(Of String) Dim cFileNames(FILENAMES_BYTES / 2 - 1) As Char Dim tempFileName As String = "" Dim files As New List(Of String) Dim i As Integer Marshal.Copy(p, cFileNames, 0, FILENAMES_BYTES / 2) For i = 0 To FILENAMES_BYTES / 2 - 1 If cFileNames(i) = vbNullChar Then 'NULL文字を見つけたらリストに追加 files.Add(tempFileName) 'NULL文字が連続したら終了 If cFileNames(i + 1) = vbNullChar Then Exit For End If tempFileName = "" Else tempFileName &= cFileNames(i).ToString() End If Next Return files End Function
一文字ずつToStringして&でくっつけていくよりも Stringクラスのコンストラクタを使ったほうが効率よさそう。 Dim start As Integer = 0 Dim length As Integer = 0 For i As Integer = 0 To FILENAMES_BYTES / 2 - 1 If cFileNames(i) = vbNullChar Then files.Add(New String(cFileNames, start, length)) start = i + 1 length = 0 If cFileNames(i + 1) = vbNullChar Then Exit For End If Else length = length + 1 End If Next
分類:[.NET]