15.1 计算机与局域网
本小节主要介绍在局域网中如何获得计算机名称和工作组、如何设置计算机IP以及如何 判断输入的IP地址是否符合要求。
实例439 获取计算机名称和工作组
实例说明
在本实例运行时,检索整个网络中的计算机和工作组,并将其以树状形式显示。当用户单击相应的计算机名时,在相应的文本框中即可显示该计算机所在的相应的计算机和工作组。其实现效果如图15.1所示。
图12.5 对分组统计数据进行分析
技术要点
本实例的实现主要是通过使用WNetOpenEnum函数获得所有网络资源的信息过程,使用WNetEnumResource函数可以列出所有网络信息,使用WNetCloseEnum函数结束列举网络资源的过程。下面分别介绍这几个API函数。
WNetOpenEnum函数。用于启动对网络资源进行枚举过程。这个函数会返回由WNetEnumResource函数用于枚举资源所用的一个句柄。其声明形式如下:
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA"
(ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long,
lpNetResource As Any, lphEnum As Long) As Long
WNetEnumResource函数。用于枚举网络资源。其声明形式如下:
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias
"WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long,
ByVal lpBuffer As Long, ByRef lpBufferSize As Long) As Long
WNetCloseEnum函数。结束一个枚举操作。
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
实现过程
(1)新建一个标准工程,创建一个新窗体,默认名为Form1。
(2)在窗体上添加两个Label控件 ,用于显示提示信息,添加两个TextBox控件 ,分别用于显示计算机名和工作组。
(3)在窗体上添加一个TreeView 控件和一个ImageList 控件。由于这两个控件属于ActiveX控件,因此,在使用之前必须将其添加到工具箱。添加方法如下:
选择VB菜单的“工程”→“部件”,然后选取Microsoft Windows Common Controls 6.0(SP6),单击“确定”按钮,即可将TreeView控件和ImageList控件添加到工具箱中。命名TreeView控件为tvwNetwork,ImageList控件为imlNWImages,并将两个控件相连。设置Image控件的Picture属性。
(4)在窗体上添加一个Winsock控件 ,由于该控件属于ActiveX控件,因此,在使用之前必须将其添加到工具箱。添加方法如下:
选择VB菜单的“工程”→“部件”,然后选取Microsoft Winsock Control 6.0(SP5),单击“确定”按钮,即可将Winsock控件添加到工具箱中。
(5)主要程序代码。
Private Sub Form_Load()
On Error Resume Next
Const MAX_RESOURCES = 256
Const NOT_A_CONTAINER = -1
Dim bFirstTime As Boolean
Dim lReturn As Long
Dim hEnum As Long
Dim lCount As Long
Dim lMin As Long
Dim lLength As Long
Dim l As Long
Dim lBufferSize As Long
Dim lLastIndex As Long
Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE_BUF
Dim uNet() As NETRESOURCE
bFirstTime = TrueDo
If bFirstTime Then
lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_ALL, ByVal 0&, hEnum)
bFirstTime = False
Else
If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then
lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_ALL, uNet(lLastIndex), hEnum)
Else
lReturn = NOT_A_CONTAINER
hEnum = 0
End If
lLastIndex = lLastIndex + 1
End If If lReturn = NO_ERROR Then
lCount = RESOURCE_ENUM_ALL
Do
lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
If lCount > 0 Then
ReDim Preserve uNet(0 To lMin + lCount - 1) As NETRESOURCE
For l = 0 To lCount - 1
uNet(lMin + l).dwScope = uNetApi(l).dwScope
uNet(lMin + l).dwType = uNetApi(l).dwType
uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
If uNetApi(l).pLocalName Then
lLength = lstrlen(uNetApi(l).pLocalName)
uNet(lMin + l).sLocalName = Space$(lLength)
CopyMem ByVal uNet(lMin + l).sLocalName, ByVal uNetApi(l).pLocalName, lLength
End IfIf uNetApi(l).pRemoteName Then
lLength = lstrlen(uNetApi(l).pRemoteName)
uNet(lMin + l).sRemoteName = Space$(lLength)
CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
End If Next l
End If
lMin = lMin + lCount
Loop While lReturn = ERROR_MORE_DATA
End If
If hEnum Then l = WNetCloseEnum(hEnum)
Loop While lLastIndex < lMinIf UBound(uNet) > 0 Then
For l = 0 To UBound(uNet)
If uNet(l).dwDisplayType = RESOURCEDISPLAYTYPE_SERVER Then
List1.AddItem uNet(l).sRemoteName
Next l
End IfEnd Sub
举一反三
根据本实例,读者可以获得:
·网上邻居的所有信息。
·网络资源信息。
【责任编辑:杜书 TEL:(010)68476606】
回书目 上一节 下一节
原文:实例439 获取计算机名称和工作组返回读书频道首页