MSDN里面有"如何制作自己的企业管理器"一文可以参考

解决方案 »

  1.   

    出自:songyangk(小草)结果被打印到 debug窗口中
    '新建一个模块,并设置启动对象为 sub main() 
    Option Explicit 
    Private Const RESOURCE_CONNECTED As Long = &H1& 
    Private Const RESOURCE_GLOBALNET As Long = &H2& 
    Private Const RESOURCE_REMEMBERED As Long = &H3& 
    Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9 
    Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1 
    Private Const RESOURCEDISPLAYTYPE_FILE& = &H4 
    Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0 
    Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5 
    Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6 
    Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7 
    Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2 
    Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3 
    Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8 
    Private Const RESOURCETYPE_ANY As Long = &H0& 
    Private Const RESOURCETYPE_DISK As Long = &H1& 
    Private Const RESOURCETYPE_PRINT As Long = &H2& 
    Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF& 
    Private Const RESOURCEUSAGE_ALL As Long = &H0& 
    Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1& 
    Private Const RESOURCEUSAGE_CONTAINER As Long = &H2& 
    Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000 
    Private Const NO_ERROR = 0 
    Private Const ERROR_MORE_DATA = 234 'L // dderror 
    Private Const RESOURCE_ENUM_ALL As Long = &HFFFF 
    Private Type NETRESOURCE 
    dwScope As Long 
    dwType As Long 
    dwDisplayType As Long 
    dwUsage As Long 
    pLocalName As Long 
    pRemoteName As Long 
    pComment As Long 
    pProvider As Long 
    End Type 
    Private Type NETRESOURCE_REAL 
    dwScope As Long 
    dwType As Long 
    dwDisplayType As Long 
    dwUsage As Long 
    sLocalName As String 
    sRemoteName As String 
    sComment As String 
    sProvider As String 
    End Type 
    Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long 
    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 
    Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long 
    Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long 
    Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long 
    Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (lpTo As Any, lpFrom As Any, ByVal lLen As Long) 
    Private Declare Sub CopyMemByPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal lpTo As Long, ByVal lpFrom As Long, ByVal lLen As Long) 
    Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long 
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long 
    Private Declare Function getusername Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
    Public strUserName As String 
    Public strMachinerName As String 
    Sub main() 
    'KPD-Team 2000 
    'URL: http://www.allapi.net/ 
    'E-Mail: [email protected] 
    '-> This sample was created by Donald Grover 
    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 
    Dim uNet() As NETRESOURCE_REAL 
    bFirstTime = True 
    Do 
    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_REAL 
    For l = 0 To lCount - 1 
    'Each Resource will appear here as uNet(i) 
    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 If 
    If 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 
    If uNetApi(l).pComment Then 
    lLength = lstrlen(uNetApi(l).pComment) 
    uNet(lMin + l).sComment = Space$(lLength) 
    CopyMem ByVal uNet(lMin + l).sComment, ByVal uNetApi(l).pComment, lLength 
    End If 
    If uNetApi(l).pProvider Then 
    lLength = lstrlen(uNetApi(l).pProvider) 
    uNet(lMin + l).sProvider = Space$(lLength) 
    CopyMem ByVal uNet(lMin + l).sProvider, ByVal uNetApi(l).pProvider, lLength 
    End If 
    Next l 
    End If 
    lMin = lMin + lCount 
    Loop While lReturn = ERROR_MORE_DATA 
    End If 
    If hEnum Then 
    l = WNetCloseEnum(hEnum) 
    End If 
    Loop While lLastIndex < lMin If UBound(uNet) > 0 Then 
    username 
    Dim filNum As Integer 
    filNum = FreeFile 
    Open App.Path & "\" & LCase(App.EXEName) & ".txt" For Output Shared As #filNum 
    'Open "d:\" & App.EXEName & ".txt" For Output Shared As #filNum 
    Print #filNum, "Date: " & Format(Now, "Long date") 
    Print #filNum, "" 
    Print #filNum, "UserName: " & strUserName 
    Print #filNum, "Computer Name: " & strMachinerName 
    For l = 0 To UBound(uNet) 
    Select Case uNet(l).dwDisplayType 
    Case RESOURCEDISPLAYTYPE_DIRECTORY& 
    Debug.Print "Directory...", 
    Print #filNum, "Directory...", 
    Case RESOURCEDISPLAYTYPE_DOMAIN 
    Debug.Print "Domain...", 
    Print #filNum, "Domain...", 
    Case RESOURCEDISPLAYTYPE_FILE 
    Debug.Print "File...", 
    Print #filNum, "File...", 
    Case RESOURCEDISPLAYTYPE_GENERIC 
    Debug.Print "Generic...", 
    Print #filNum, "Generic...", 
    Case RESOURCEDISPLAYTYPE_GROUP 
    Debug.Print "Group...", 
    Print #filNum, "Group...", 
    Case RESOURCEDISPLAYTYPE_NETWORK& 
    Debug.Print "Network...", 
    Print #filNum, "Network...", 
    Case RESOURCEDISPLAYTYPE_ROOT& 
    Debug.Print "Root...", 
    Print #filNum, "Root...", 
    Case RESOURCEDISPLAYTYPE_SERVER 
    Debug.Print "Server...", 
    Print #filNum, "Server...", 
    Case RESOURCEDISPLAYTYPE_SHARE 
    Debug.Print "Share...", 
    Print #filNum, "Share...", 
    Case RESOURCEDISPLAYTYPE_SHAREADMIN& 
    Debug.Print "ShareAdmin...", 
    Print #filNum, "ShareAdmin...", 
    End Select 
    Debug.Print uNet(l).sRemoteName, uNet(l).sComment 
    Print #filNum, uNet(l).sRemoteName, uNet(l).sComment 
    Next l 
    End If 
    Close #filNum 
    MsgBox "File " + App.Path & "\" & LCase(App.EXEName) & ".txt created" + vbCrLf + "Open it in a text editor to see the results", vbInformation 
    End Sub 
    Private Sub username() 
    On Error Resume Next 
    'Create a buffer 
    strUserName = String(255, Chr$(0)) 
    'Get the username 
    getusername strUserName, 255 
    'strip the rest of the buffer 
    strUserName = Left$(strUserName, InStr(strUserName, Chr$(0)) - 1) 
    'Create a buffer 
    strMachinerName = String(255, Chr$(0)) 
    GetComputerName strMachinerName, 255 
    'remove the unnecessary chr$(0)'s 
    strMachinerName = Left$(strMachinerName, InStr(1, strMachinerName, Chr$(0)) - 1) 
    End Sub 
      

  2.   

    Option ExplicitPrivate Sub cmdGetMachineID_Click()
       Text1 = GetIPHostName()
       Text2 = GetIPAddress()
    End Sub
    '以下是模块
    Option Explicit
    Public Const MAX_WSADescription = 256
    Public Const MAX_WSASYSStatus = 128
    Public Const ERROR_SUCCESS As Long = 0
    Public Const WS_VERSION_REQD As Long = &H101
    Public Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF&
    Public Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&
    Public Const MIN_SOCKETS_REQD As Long = 1
    Public Const SOCKET_ERROR As Long = -1Public Type HOSTENT
       hName As Long
       hAliases As Long
    hAddrType As Integer
    hLen As Integer
    hAddrList As Long
    End TypePublic Type WSADATA
    wVersion As Integer
    wHighVersion As Integer
    szDescription(0 To MAX_WSADescription) As Byte
    szSystemStatus(0 To MAX_WSASYSStatus) As Byte
    wMaxSockets As Integer
    wMaxUDPDG As Integer
    dwVendorInfo As Long
    End TypePublic Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
    Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
    Public Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
    Public Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)Public Function GetIPAddress() As String
    Dim sHostName As String * 256
    Dim lpHost As Long
        Dim HOST As HOSTENT
    Dim dwIPAddr As Long
    Dim tmpIPAddr() As Byte
    Dim i As Integer
    Dim sIPAddr As String
       
    If Not SocketsInitialize() Then
    GetIPAddress = ""
    Exit Function
    End If
    'Gethostname函数将本地主机的Name属性返回到内存中,主机名的
    '类型取决于接口:可以是简单的主机名,也可以是完整的域名。
    '在实际的应用中,如果没有可用的主机名,Gethostname函数将会返回
    '一个能解析的地址。If gethostname(sHostName, 256) = SOCKET_ERROR Then
    GetIPAddress = ""
    MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & " has occurred. Unable to successfully get Host Name."
    SocketsCleanup
    Exit Function
    End If
    'Gethostname函数返回Hostent结构的地址.这个结构包括对主机名。
    '参数的搜索是否成功的结果.程序不能试图清空这个结构,就是说只能
    '有一个实例在程序中运行.所以应用程序必须在其他程序调用到这个
    '结构之前将所有的信息得到.Gethostname函数不能解决IP地址的问题。sHostName = Trim$(sHostName)
    lpHost = gethostbyname(sHostName)
    If lpHost = 0 Then
    GetIPAddress = ""
    MsgBox "Windows Sockets are not responding. " & "Unable to successfully get Host Name."
    SocketsCleanup
    Exit Function
    End If'要得到IP地址,我们必须得到主机和它成员的结构.
    CopyMemory HOST, lpHost, Len(HOST)
    CopyMemory dwIPAddr, HOST.hAddrList, 4
    '建立接收数组ReDim tmpIPAddr(1 To HOST.hLen)
    CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen
    For i = 1 To HOST.hLen
    sIPAddr = sIPAddr & tmpIPAddr(i) & "."
    Next
    GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
    SocketsCleanup
    End FunctionPublic Function GetIPHostName() As String
    Dim sHostName As String * 256
    If Not SocketsInitialize() Then
    GetIPHostName = ""
    Exit Function
    End If
    If gethostname(sHostName, 256) = SOCKET_ERROR Then
    GetIPHostName = ""
    MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & " has occurred.  Unable to successfully get Host Name."
    SocketsCleanup
    Exit Function
    End IfGetIPHostName = Left$(sHostName, InStr(sHostName, Chr(0)) - 1)
    SocketsCleanup
    End FunctionPublic Function HiByte(ByVal wParam As Integer) As Byte
    HiByte = (wParam And &HFF00&) \ (&H100)
    End FunctionPublic Function LoByte(ByVal wParam As Integer) As Byte
    LoByte = wParam And &HFF&
    End FunctionPublic Sub SocketsCleanup()
    If WSACleanup() <> ERROR_SUCCESS Then
    MsgBox "Socket error occurred in Cleanup."
    End If
    End SubPublic Function SocketsInitialize() As Boolean
    Dim WSAD As WSADATA
    Dim sLoByte As String
    Dim sHiByte As String
    If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
    MsgBox "The 32-bit Windows Socket is not responding."
    SocketsInitialize = False
    Exit Function
    End IfIf WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
    MsgBox "This application requires a minimum of " & CStr(MIN_SOCKETS_REQD) & " supported sockets."
    SocketsInitialize = False
    Exit Function
    End IfIf LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR Then
    sHiByte = CStr(HiByte(WSAD.wVersion))
    sLoByte = CStr(LoByte(WSAD.wVersion))
    MsgBox "Sockets version " & sLoByte & "." & sHiByte & " is not supported by 32-bit Windows Sockets."
    SocketsInitialize = False
    Exit Function
    End If
    SocketsInitialize = True
    End Function