フォルダダイアログについて
- 題名: フォルダダイアログについて
- 著者: ふたば
- 日時: 2006/03/31 12:23:26
- ID: 15134
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: フォルダダイアログについて
- 著者: よねKEN
- 日時: 2006/03/31 13:00:24
- ID: 15135
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: フォルダダイアログについて
- 著者: ふたば
- 日時: 2006/03/31 15:19:20
- ID: 15138
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: フォルダダイアログについて
- 著者: 渋木宏明(ひどり)
- URL: http://hidori.jp/
- 日時: 2006/04/01 7:47:22
- ID: 15144
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: フォルダダイアログについて
- 著者: ふたば
- 日時: 2006/04/01 10:23:32
- ID: 15145
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: フォルダダイアログについて
- 著者: ふたば
- 日時: 2006/04/01 11:01:21
- ID: 15146
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
こんにちわ。 SHBrowseForFolder APIを使用してフォルダ選択ダイアログを作っているのですが、下記コードを実行すると、 「System.EntryPointNotFoundException:DLL user32のSendMessageというエントリポイントが見つかりません。」という エラーが発生した後、画面が固まってしまいます。 コードは非.NETのVBのサンプルコードを手直ししたのですが(.NETのサンプルが見つからなかった)、コールバック関数部分 がうまく動作していないのでしょうか。 また、System.Windows.Forms.FolderBrowserDialogを使わないのはネットワークフォルダのみの指定ができないためです。 目的の仕様としては「ネットワークの共有フォルダのみ参照可能。初期フォルダは自PCの共有フォルダ(固定名)」 です。(下記コードはテストなのでDeskTopにしていますが) これが実装できれば手法には拘っていません。下記コードの不正部分、もしくは上記仕様の実現についての情報があれば よろしくお願いします。 Public Declare Function SHBrowseForFolder Lib "shell32.dll" (ByRef lpBROWSEINFO As BROWSEINFO) As Integer Public Declare Function SHGetPathFromIDList Lib "shell32.dll" (ByVal pidl As Integer, ByVal pszPath As String) As Integer Public Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Integer) Public Const CSIDL_DESKTOP = &H0 Public Const BIF_RETURNONLYFSDIRS = &H1 Public Const MAX_PATH = 260 Public Structure BROWSEINFO Dim hwndOwner As Integer Dim pidlRoot As Integer Dim pszDisplayName As String Dim lpszTitle As String Dim ulFlags As Integer Dim lpfn As Delegate1 Dim lParam As String Dim iImage As Integer End Structure Public Declare Function SendMessage Lib "user32" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Public Const WM_USER = &H400 Public Const BFFM_SETSELECTIONA = (WM_USER + 102) Public Const BFFM_INITIALIZED = 1 Public Delegate Function Delegate1(ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer Private Function mOpenFolderDialog32(ByRef SelectedFoldername As String) As Boolean Dim Browse As BROWSEINFO Dim pID As Integer Dim PathName As String Try With Browse .hwndOwner = Me.Handle.ToInt32 .pidlRoot = CSIDL_DESKTOP .lpszTitle = "フォルダを選択してください" .ulFlags = BIF_RETURNONLYFSDIRS .lpfn = AddressOf BrowseCallbackProc 'コールバック関数のアドレス .lParam = CurDir() & vbNullChar '初期フォルダのパス名 End With '「フォルダの参照」ダイアログの呼び出し pID = SHBrowseForFolder(Browse) If pID Then '予めNull文字をセット PathName = New String(CChar(" "), MAX_PATH) 'SHBrowseForFolderで得られた値からフォルダのパス名を取得 SHGetPathFromIDList(pID, PathName) '割り当てられたメモリを開放 CoTaskMemFree(pID) Dim n As Integer = InStr(PathName, vbNullChar) If n Then SelectedFoldername = Microsoft.VisualBasic.Strings.Left(PathName, n - 1) End If End If mOpenFolderDialog32 = True Catch ex As Exception 'エラーメッセージを表示する MessageBox.Show(ex.ToString) End Try End Function 'コールバック関数 Public Function BrowseCallbackProc(ByVal hWnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer If uMsg = BFFM_INITIALIZED Then SendMessage(hWnd, BFFM_SETSELECTIONA, 1, lpData) End If End Function '------------------呼び出し------------------ Private Sub cmdFileDialog_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFileDialog.Click Dim str As String mOpenFolderDialog32(str) MessageBox.Show(str) End Sub