Drucker: Vorhandene Papierschächte ermitteln

Veröffentlicht: 03. Aug 2001 | Aktualisiert: 13. Jun 2004

Von Mathias Schiffer

Die Einstellung der PaperBin-Eigenschaft des Printer-Objekts ist eine haarige Angelegenheit: Sie ist darauf angewiesen, dass sich der Hersteller des verwendeten Druckertreibers an die Papierschachtnummern hält, die Visual Basic wie in der Produktdokumentation aufgelistet anbietet. Leider ist dies jedoch nicht die Regel, sondern eher die Ausnahme.

Um zu ermitteln, welche Papierschächte der verwendete Druckertreiber tatsächlich und unter welcher Schachtnummer anbietet, bietet Visual Basic selbst keine Möglichkeit. Abhilfe jedoch findet sich mit der API-Funktion DeviceCapabilities, die sowohl die entsprechenden Nummern als auch die für die Papierschächte vergebenen Klartextnamen ermitteln kann.

Der folgende Code ermittelt diese Informationen in einem zweidimensionalen Array PaperBins und gibt die Nummern und Namen der Papierschächte im Direktfenster aus:

' Prototypisierung der API-Funktion DeviceCapabilities 
Private Declare Function DeviceCapabilities _ 
  Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _ 
  ByVal lpDeviceName As String, _ 
  ByVal lpPort As String, _ 
  ByVal iIndex As Long, _ 
  ByRef lpOutput As Any, _ 
  ByVal dev As Long _ 
  ) As Long 
' Konstante für den Parameter iIndex 
Private Const DC_BINS As Long = 6& 
Private Const DC_BINNAMES As Long = 12& 
Private Sub ListPaperBins() 
Dim PaperBins() As String 
Dim lBinCount As Long 
Dim lBinNumbers() As Integer 
Dim sBinNames As String 
Dim lNullPos As Long 
Dim i As Long 
  With Printer 
    ' Anzahl unterstützter Papierschächte ermitteln: 
    lBinCount = DeviceCapabilities(.DeviceName, .Port, _ 
                DC_BINS, ByVal vbNullString, 0) 
    ' Speicherplatz für die Rückgaben reservieren 
    ReDim lBinNumbers(1 To lBinCount) 
    sBinNames = Space$(24 * lBinCount) 
    ' Nummern vorhandener Papierschächte abholen: 
    DeviceCapabilities .DeviceName, .Port, DC_BINS, lBinNumbers(1), 0 
    ' Namen der vorhandenen Papierschächte abholen: 
    DeviceCapabilities .DeviceName, .Port, DC_BINNAMES, ByVal sBinNames, 0 
  End With 
  ' Schachtnummern und -namen extrahieren 
  ' und im zweidimensionalen Array PaperBins ablegen: 
  ReDim PaperBins(0 To lBinCount - 1, 0 To 1) 
  For i = 1 To lBinCount 
    ' Schachtnummer: 
    PaperBins(i - 1, 0) = lBinNumbers(i) 
    ' Schachtname: 
    PaperBins(i - 1, 1) = Mid$(sBinNames, 24 * (i - 1) + 1, 24) 
    ' Im Bedarfsfall das Stringende kürzen: 
    lNullPos = InStr(PaperBins(i - 1, 1), vbNullChar) 
    If lNullPos > 0 Then 
      PaperBins(i - 1, 1) = Left$(PaperBins(i - 1, 1), lNullPos - 1) 
    End If 
  Next i 
  ' Die gefundenen Daten in das Direktfenster ausgeben: 
  Debug.Print "Vorhandene Papierschächte des Druckers " _ 
              & Printer.DeviceName & " am Anschluss " _ 
              & Printer.Port & " :" 
  For i = LBound(PaperBins) To UBound(PaperBins) 
    Debug.Print PaperBins(i, 0) & ": " & PaperBins(i, 1) 
  Next i 
End Sub