フォルダの参照ダイアログ

解決


まーち  2009-11-03 23:52:25  No: 142762

環境  XP 
VB.net 2002 Standard

フォルダの参照ダイアログを表示してパスを取得するクラスを作りたいのですが、下記の最後の方の、Call SHGetPathFromIDList(lReturn, stPath)で、エラーが出てしまいます。内容は、「System.NullReferenceException' のハンドルされていない例外が ShkTD.exe で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。

お忙しいところ恐れ入りますが、宜しくお願いします。
 Private Declare Function SHBrowseForFolder Lib "SHELL32.DLL" Alias "SHBrowseForFolderA" ( _
           ByRef lpBrowseInfo As TypeBrowseInfo _
            ) As Long

    Private Declare Function SHGetPathFromIDList Lib "SHELL32.DLL" Alias "SHGetPathFromIDListA" ( _
        ByVal pidl As Long, _
        ByVal pszPath As String _
    ) As Long

    Private Declare Sub CoTaskMemFree Lib "OLE32.DLL" (ByVal pv As Long)

    Private Structure TypeBrowseInfo    
        Dim OwnerHandle As Long
        Dim Root As Long
        Dim DisplayName As String
        Dim Description As String
        Dim Flags As BifOptions
        Dim lpfn As Long
        Dim lParam As String
        Dim iImage As Long
    End Structure 'Type

    Private Enum BifOptions
        ReturnOnlyFileSystemDirectories = &H1     
        HideNetworkResource = &H2                 
        StatusText = &H4                          
        OnlyNetworkResource = &H8                 
        ShowEditBox = &H10                        
        Validate = &H20                           
        NewDialogStyle = &H40                     
        BrowseForComputer = &H1000                
        BrowseForPrinter = &H2000                 
        BrowseIncludeFiles = &H4000               
    End Enum

    ' プロパティ 変数
    Private m_SelectedPath As String
    Private Browseinfo As TypeBrowseInfo
    Dim bi As TypeBrowseInfo

    Public Property SelectedPath() As String
        Get
            Return m_SelectedPath
        End Get
        Set(ByVal Value As String)
            m_SelectedPath = Value
        End Set
    End Property

    Public Property Description() As String
        Get
            Return Browseinfo.Description
        End Get
        Set(ByVal Value As String)
            Browseinfo.Description = Value
        End Set
    End Property

    Public Property ShowNewFolderButton() As Boolean
        Get
            Return ((Browseinfo.Flags And BifOptions.NewDialogStyle) > 0)
        End Get
        Set(ByVal Value As Boolean)

            If ShowNewFolderButton = True Then           
                Browseinfo.Flags = Browseinfo.Flags Or BifOptions.NewDialogStyle   
            Else
                Browseinfo.Flags = Browseinfo.Flags And Not BifOptions.NewDialogStyle     
            End If

        End Set
    End Property

    Public Sub New()
        Browseinfo.Flags = Browseinfo.Flags Or BifOptions.NewDialogStyle  'NewDialogStyle
    End Sub

    '「フォルダの参照」ダイアログを表示する
    Public Function ShowDialog(Optional ByVal hOwnerHandle As Long = 0&) As Boolean
        Dim lReturn As Long
        Dim stPath As String
        
        ' 親ハンドルを設定する
        Browseinfo.OwnerHandle = hOwnerHandle  

        'Browseinfo.DisplayName = New String(vbNullChar, MAX_PATH)

        'Browseinfo.Flags = BifOptions.ReturnOnlyFileSystemDirectories    

        '「フォルダの参照」ダイアログを呼び出す

        lReturn = SHBrowseForFolder(bi)

        ' OK が押下された場合
        If lReturn <> 0 Then

            stPath = Microsoft.VisualBasic.Strings.StrDup(65536, Microsoft.VisualBasic.vbNullChar)
  
            Call SHGetPathFromIDList(lReturn, stPath)
            Call CoTaskMemFree(lReturn)
            
            Me.SelectedPath = Microsoft.VisualBasic.Strings.Left _
            (stPath, Microsoft.VisualBasic.Strings.InStr(stPath, Microsoft.VisualBasic.vbNullChar) - 1)
            ShowDialog = True
        End If
    End Function


Hongliang  2009-11-03 23:58:49  No: 142763

取り敢えず、API の DWORD や UINT は 32bit 整数値であり、VB7(=VB2002)以降の Long は 64bit 整数値です。


まーち  2009-11-04 02:10:13  No: 142764

Hongliangさま、
早々なる返答戴き有難うございます!
おかげさまでうまく行きました。
助かりました!有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加