Tipp 5.3 - Alle Drucker ermitteln

Wie kann ich alle verfügbaren Drucker ermitteln?

Mit dieser Funktion können Sie alle verfügbaren Drucker ermitteln. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.

Api-AufrufeVerwendete Win32-Api-Aufrufe und Typen: EnumPrinters, lstrlenA, lstrcpyA - PRINTER_INFO_1

Beispiel:

Option Explicit
 
Public Type PRINTER_INFO_1
  Flags           As Long
  prescription    As Long
  Pane            As Long
  Comment         As Long
End Type
 
Public Declare Function EnumPrinters _
    Lib "winspool.drv" Alias _
    "EnumPrintersA" _
    (ByVal Flags As Long, _
    ByVal Name As String, _
    ByVal Level As Long, _
    pPrinterEnum As Any, _
    ByVal cdBuf As Long, _
    pcbNeeded As Long, _
    pcReturned As Long) As Long
 
Public Declare Function lstrlenA _
    Lib "kernel32" _
    (ByVal Ptr As Any) As Long
 
Public Declare Function lstrcpyA _
    Lib "kernel32" _
    (ByVal RetVal As String, _
    ByVal Ptr As Long) As Long
 
Function GetPrinterList(asPrinter() As String) As Long
  '// -----------------------------------------------------
  '// Methode:   | Alle verfügbaren Drucker ermitteln
  '//            | benötigt Hilfsfunktion GetStrFromPtrA
  '// -----------------------------------------------------
  '// Parameter: | asPrinter() -Stringarray für die Drucker
  '// -----------------------------------------------------
  '// Rückgabe:  | Anzahl gefundener Drucker
  '//            | = UBound(asPrinter) - 1
  '// -----------------------------------------------------
  '// Autor:     | Stefan Kulpa
  '//            | EDV Innovation & Consulting - Dormagen
  '// -----------------------------------------------------
  '// Beispiel:
  '// -----------------------------------------------------
  '// Dim asPrinter() As String
  '// Dim lPrntCount  As Long
  '// Dim lCounter    As Long
  '// lCounter = GetPrinterList(asPrinter)
  '// If lCounter > 0 Then
  '//     For lCounter = 0 To UBound(asPrinter) - 1
  '//         Debug.Print asPrinter(lCounter)
  '//     Next
  '// End If
  '// -----------------------------------------------------
  Const SIZEOFPRINTER_INFO_1      As Long = 16
  Const PRINTER_ENUM_CONNECTIONS  As Long = &H4
  Const PRINTER_ENUM_LOCAL        As Long = &H2
  Const PRINTER_LEVEL1            As Long = &H1
 
  Dim uaPInfo()                   As PRINTER_INFO_1
  Dim lRequired                   As Long
  Dim cbBuffer                    As Long
  Dim lEntries                    As Long
  Dim lCounter                    As Long
 
  Call EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
      PRINTER_ENUM_LOCAL, _
      vbNullString, _
      PRINTER_LEVEL1, _
      0, _
      0, _
      lRequired, _
      lEntries)
 
  ReDim uaPInfo((lRequired \ SIZEOFPRINTER_INFO_1))
  cbBuffer = lRequired
  If EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
      PRINTER_ENUM_LOCAL, _
      vbNullString, _
      PRINTER_LEVEL1, _
      uaPInfo(0), _
      cbBuffer, _
      lRequired, _
      lEntries) Then
    ReDim asPrinter(lEntries)
    For lCounter = 0 To lEntries - 1
      asPrinter(lCounter) = GetStrFromPtrA( _
          uaPInfo(lCounter).Pane)
    Next lCounter
  End If
  GetPrinterList = lEntries
 
End Function
 
Public Function GetStrFromPtrA( _
                ByVal lpszA As Long) _
                As String
 
  On Error Resume Next
  GetStrFromPtrA = VBA.String$(lstrlenA(ByVal lpszA), 0)
  Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
 
End Function