在VB中如何枚举局域网内所有的打印机

解决方案 »

  1.   

    主要用EnumPrinters 这个API函数。我是在API浏览器上看到的例子。试过了可以用的。但我也不知道具体是怎么实现的。你有不懂的再叫高手帮忙解释一下。
    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
    Const PRINTER_ENUM_LOCAL = &H2
    Private Type PRINTER_INFO_1
            flags As Long
            pDescription As String
            pName As String
            pComment As String
    End Type
    Private Sub Form_Load()
        Dim longbuffer() As Long  ' resizable array receives information from the function
        Dim printinfo() As PRINTER_INFO_1  ' values inside longbuffer() will be put into here
        Dim numbytes As Long  ' size in bytes of longbuffer()
        Dim numneeded As Long  ' receives number of bytes necessary if longbuffer() is too small
        Dim numprinters As Long  ' receives number of printers found
        Dim c As Integer, retval As Long  ' counter variable & return value
        Me.AutoRedraw = True 'Set current graphic mode to persistent
        ' Get information about the local printers
        numbytes = 3076  ' should be sufficiently big, but it may not be
        ReDim longbuffer(0 To numbytes / 4) As Long  ' resize array -- note how 1 Long = 4 bytes
        retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
        If retval = 0 Then  ' try enlarging longbuffer() to receive all necessary information
            numbytes = numneeded
            ReDim longbuffer(0 To numbytes / 4) As Long  ' make it large enough
            retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
            If retval = 0 Then ' failed again!
                Debug.Print "Could not successfully enumerate the printes."
            End  ' abort program
        End If
        End If
        ' Convert longbuffer() data into printinfo()
        If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PRINTER_INFO_1 ' room for each printer
        For c = 0 To numprinters - 1  ' loop, putting each set of information into each element
            ' longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
            ' For each string, the string is first buffered to provide enough room, and then the string is copied.
            printinfo(c).flags = longbuffer(4 * c)
            printinfo(c).pDescription = Space(lstrlen(longbuffer(4 * c + 1)))
            retval = lstrcpy(printinfo(c).pDescription, longbuffer(4 * c + 1))
            printinfo(c).pName = Space(lstrlen(longbuffer(4 * c + 2)))
            retval = lstrcpy(printinfo(c).pName, longbuffer(4 * c + 2))
            printinfo(c).pComment = Space(lstrlen(longbuffer(4 * c + 3)))
            retval = lstrcpy(printinfo(c).pComment, longbuffer(4 * c + 3))
        Next c
        ' Display name of each printer
        For c = 0 To numprinters - 1
            Me.Print "Name of printer"; c + 1; " is: "; printinfo(c).pName
        Next c
    End Sub
      

  2.   


       API函数EnumPrinters为什么会返回不是0?
      

  3.   

    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
    Const PRINTER_ENUM_LOCAL = &H2
    Private Type PRINTER_INFO_1
            flags As Long
            pDescription As String
            pName As String
            pComment As String
    End Type
    Private Sub Form_Load()
        Dim longbuffer() As Long  ' resizable array receives information from the function
        Dim printinfo() As PRINTER_INFO_1  ' values inside longbuffer() will be put into here
        Dim numbytes As Long  ' size in bytes of longbuffer()
        Dim numneeded As Long  ' receives number of bytes necessary if longbuffer() is too small
        Dim numprinters As Long  ' receives number of printers found
        Dim c As Integer, retval As Long  ' counter variable & return value
        Me.AutoRedraw = True 'Set current graphic mode to persistent
        ' Get information about the local printers
        numbytes = 3076  ' should be sufficiently big, but it may not be
        ReDim longbuffer(0 To numbytes / 4) As Long  ' resize array -- note how 1 Long = 4 bytes
        retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
        If retval = 0 Then  ' try enlarging longbuffer() to receive all necessary information
            numbytes = numneeded
            ReDim longbuffer(0 To numbytes / 4) As Long  ' make it large enough
            retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
            If retval = 0 Then ' failed again!
                Debug.Print "Could not successfully enumerate the printes."
            End  ' abort program
        End If
        End If
        ' Convert longbuffer() data into printinfo()
        If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PRINTER_INFO_1 ' room for each printer
        For c = 0 To numprinters - 1  ' loop, putting each set of information into each element
            ' longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
            ' For each string, the string is first buffered to provide enough room, and then the string is copied.
            printinfo(c).flags = longbuffer(4 * c)
            printinfo(c).pDescription = Space(lstrlen(longbuffer(4 * c + 1)))
            retval = lstrcpy(printinfo(c).pDescription, longbuffer(4 * c + 1))
            printinfo(c).pName = Space(lstrlen(longbuffer(4 * c + 2)))
            retval = lstrcpy(printinfo(c).pName, longbuffer(4 * c + 2))
            printinfo(c).pComment = Space(lstrlen(longbuffer(4 * c + 3)))
            retval = lstrcpy(printinfo(c).pComment, longbuffer(4 * c + 3))
        Next c
        ' Display name of each printer
        For c = 0 To numprinters - 1
            Me.Print "Name of printer"; c + 1; " is: "; printinfo(c).pName
        Next c
    End Sub
      

  4.   

    Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
    Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
    Const PRINTER_ENUM_LOCAL = &H2
    Private Type PRINTER_INFO_1
            flags As Long
            pDescription As String
            pName As String
            pComment As String
    End Type
    Private Sub Form_Load()
        Dim longbuffer() As Long  ' resizable array receives information from the function
        Dim printinfo() As PRINTER_INFO_1  ' values inside longbuffer() will be put into here
        Dim numbytes As Long  ' size in bytes of longbuffer()
        Dim numneeded As Long  ' receives number of bytes necessary if longbuffer() is too small
        Dim numprinters As Long  ' receives number of printers found
        Dim c As Integer, retval As Long  ' counter variable & return value
        Me.AutoRedraw = True 'Set current graphic mode to persistent
        ' Get information about the local printers
        numbytes = 3076  ' should be sufficiently big, but it may not be
        ReDim longbuffer(0 To numbytes / 4) As Long  ' resize array -- note how 1 Long = 4 bytes
        retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
        If retval = 0 Then  ' try enlarging longbuffer() to receive all necessary information
            numbytes = numneeded
            ReDim longbuffer(0 To numbytes / 4) As Long  ' make it large enough
            retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
            If retval = 0 Then ' failed again!
                Debug.Print "Could not successfully enumerate the printes."
            End  ' abort program
        End If
        End If
        ' Convert longbuffer() data into printinfo()
        If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PRINTER_INFO_1 ' room for each printer
        For c = 0 To numprinters - 1  ' loop, putting each set of information into each element
            ' longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
            ' For each string, the string is first buffered to provide enough room, and then the string is copied.
            printinfo(c).flags = longbuffer(4 * c)
            printinfo(c).pDescription = Space(lstrlen(longbuffer(4 * c + 1)))
            retval = lstrcpy(printinfo(c).pDescription, longbuffer(4 * c + 1))
            printinfo(c).pName = Space(lstrlen(longbuffer(4 * c + 2)))
            retval = lstrcpy(printinfo(c).pName, longbuffer(4 * c + 2))
            printinfo(c).pComment = Space(lstrlen(longbuffer(4 * c + 3)))
            retval = lstrcpy(printinfo(c).pComment, longbuffer(4 * c + 3))
        Next c
        ' Display name of each printer
        For c = 0 To numprinters - 1
            Me.Print "Name of printer"; c + 1; " is: "; printinfo(c).pName
        Next c
    End Sub
      

  5.   

    to zgvslch(烟花离落) 
       我试了一下,没有 库啊