各位老大,帮我看看这段代码吧。我哭..........

VBCricket 2003-10-09 09:20:43
Private Class BROWSEINFO
Public hOwner As Long
Public pidlRoot As Long
Public pszDisplayName As String
Public lpszTitle As String
Public ulFlags As Long
Public lpfn As Long
Public lParam As Long
Public iImage As Long
End Class

Const BIF_RETURNONLYFSDIRS = &H1

Private pidl As Long

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long

Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (ByVal lpBrowseInfo As BROWSEINFO) As Long


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bi As BROWSEINFO
Dim r As Long
Dim pidl As Long
Dim path As String
Dim pos As Integer

bi.hOwner = Me.Handle.ToInt64 '句柄

bi.pidlRoot = 0& '展开根目录

bi.lpszTitle = "请选择软件安装路径:" '列表框标题

bi.ulFlags = BIF_RETURNONLYFSDIRS '规定只能选择文件夹,其他无效

pidl = SHBrowseForFolder(bi) '调用API函数显示列表框

'利用API函数获取返回的路径
path = Space$(512)
r = SHGetPathFromIDList(pidl&, path)
If r Then
pos = InStr(path, Chr(0))
Me.TextBox1.Text = Microsoft.VisualBasic.Left(path, pos - 1)
Else
Me.TextBox1.Text = ""
End If

End Sub

运行到
bi.hOwner = Me.Handle.ToInt64 '句柄
的时候,不知道出现什么问题。
痛苦死了。
谢谢各位老大。
...全文
63 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
VBCricket 2003-10-13
  • 打赏
  • 举报
回复
非常感谢老大。这个程序终于调试成功了。
太感谢了。
Brunhild 2003-10-12
  • 打赏
  • 举报
回复
漏说了一个错误:SHBrowseForFolder 的参数应该用byref,因为照参数的命名方式,传入的应该是指针,而非结构数据,即使byval在vb6中行得通。

Brunhild 2003-10-12
  • 打赏
  • 举报
回复
你的API连定义都不对,BROWSEINFO应该是Structure而非CLASS;VB6中的LONG对应VB.NET是INTEGER,现在你照写,不出错才怪。

Imports System.Runtime.InteropServices

Public Class Form2
Private Structure BROWSEINFO
Public hOwner As Integer
Public pidlRoot As Integer

<MarshalAs(UnmanagedType.LPStr)> _
Public pszDisplayName As String

<MarshalAs(UnmanagedType.LPStr)> _
Public lpszTitle As String

Public ulFlags As Integer
Public lpfn As Integer
Public lParam As Integer
Public iImage As Integer
End Structure

Const BIF_RETURNONLYFSDIRS as integer= &H1

Private pidl As Integer

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Integer, ByVal pszPath As System.Text.StringBuilder) As Integer
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (ByRef lpBrowseInfo As BROWSEINFO) As Integer


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bi As BROWSEINFO
Dim r As Long
Dim pidl As Long
Dim path As New System.Text.StringBuilder(512)
Dim pos As Integer

bi.hOwner = Me.Handle.ToInt32 '句柄

bi.pidlRoot = 0& '展开根目录

bi.lpszTitle = "请选择软件安装路径:" '列表框标题

bi.ulFlags = BIF_RETURNONLYFSDIRS '规定只能选择文件夹,其他无效

pidl = SHBrowseForFolder(bi) '调用API函数显示列表框

'利用API函数获取返回的路径
r = SHGetPathFromIDList(pidl, path)

'*** 以下这些语句是不需要的,因为stringbuilder会自动将0去掉
'If r Then
' pos = InStr(path, Chr(0))
' Me.TextBox1.Text = Microsoft.VisualBasic.Left(path, pos - 1)
'Else
' Me.TextBox1.Text = ""
'End If
Me.TextBox1.Text = path.ToString()
End Sub

End Class
VBCricket 2003-10-11
  • 打赏
  • 举报
回复
我按照你的方法尝试过了。把所有原来的Long都变成Ingeter,Toint64跟Toint32我都尝试过了。还是不行。
SammyXu 2003-10-11
  • 打赏
  • 举报
回复
MSDN中的内容:
Long 变量以带符号的 64 位(8 字节)整数形式存储,取值范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

可将 Long 数据类型转换为 Single、Double 或 Decimal,而不会出现 System.OverflowException 错误。

警告 如果您在建立与在 Visual Basic 6.0 中编写的组件(例如自动化对象或 COM 对象)之间的接口,请牢记 Long 在 Visual Basic 6.0 中具有不同的数据宽度(32 位)。若将一个 32 位参数传递给这样的组件,在 Visual Basic .NET 中应将其声明为 Integer 而不是 Long。

此外,自动化在某些平台(如 Windows 2000 和 Windows 98)上不支持 64 位整数。您不能将 Visual Basic .NET Long 型参数传递给这些平台上的自动化组件。
在文本后追加文本类型字符 L 可将其强制转换成 Long 数据类型。在任何标识符后追加标识符类型字符 & 可将其强制转换成 Long 数据类型。

等价的 .NET 数据类型是 System.Int64。

你看看跟64位有没有关系。
VBCricket 2003-10-11
  • 打赏
  • 举报
回复
在VB6.0里面这一行的代码是:
bi.hOwner = Me.hWnd '句柄
VBCricket 2003-10-11
  • 打赏
  • 举报
回复
运行到
bi.hOwner = Me.Handle.ToInt64 '句柄
这一行出现问题。

下面是windows给我提示的信息:

未处理的“System.NullReferenceException”类型的异常出现在 WindowsApplication1.exe 中。

其他信息: 未将对象引用设置到对象的实例。

我不太清楚代码应该怎么修改。
xiaolang800 2003-10-10
  • 打赏
  • 举报
回复
类有句柄吗?好像只有能显示出来的控件才有句柄
brightheroes 2003-10-10
  • 打赏
  • 举报
回复
错误是什么
cnhgj 2003-10-10
  • 打赏
  • 举报
回复
为什么不知道出现什么问题?
VBCricket 2003-10-10
  • 打赏
  • 举报
回复
难道没有人能够回答我吗?
郁闷ing...
期待ing...

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧