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.
Verwendete 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