vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Drucken22.03.05
EnumPrinters-Funktion

Diese Funktion ermittelt alle vorhanden Drucker des Systems oder eines Netzwerkrechners.

Betriebssystem:  Win95, Win98, WinNT 3.1, Win2000, WinMEViews:  13.189 

Deklaration:

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

Beschreibung:
Diese Funktion ermittelt alle vorhanden Drucker des Systems oder eines Netzwerkrechners.

Parameter:
flagsErwartet eine oder eine Kombination aus mehreren der "flags"-Konstanten die beschreiben, welcheArten von Druckern ermittelt werden sollen.
nameErwartet den Namen eines Netzwerkrechners auf dem nach vorhandenen Druckern gesucht werden soll. Wurde keineentsprechende "flags"-Konstante gesetzt, so muss man hier einen leeren String übergeben.
LevelErwartet einen Wert von 1 bis 5, wobei jede Zahl für eine Struktur steht inderen Datenformat die Druckerinformationen zurückgegeben werden. Für Windows NT sind nur dieWerte 1, 2 oder 4 möglich. Unter den anderen Betriebssystemen werden die Zahlen 1,2 oder 5 erwartet.
pPrinterEnumErwartet einen Long-Array Puffer, dessen Gesamtgröße (1 Feld = 4 Bits) der Größe entspricht, diebenötigt wird. Um die benötigte Gesamtgröße zu ermitteln kann man die Funktion mit einem zu kleinen Puffer aufrufen, wobei "pcbNeeded" mit der Anzahl der benötigten Bytes in dem Puffer gefüllt wird. Anschließend enthält jedes Long-Feld des Arrays entweder eine Zahl die einerVariable der Datenformat-Struktur entspricht oder einen Pointer zu einerString-Variable, die manuell anhand dieses Pointer ermittelt werden muss. Ist der Puffer nicht ausreichend groß um die angeforderte Datenmenge zu empfangen, so wird "pcbNeeded" mit der benötigten Gesamtgröße des Puffers gefüllt. Je nachdem welcherWert bei "Level" übergeben wurde, enthält der Puffer nach erfolgreichem Aufruf für jeden gefunden Drucker eine PRINTER_INFO_1-, PRINTER_INFO_2-, PRINTER_INFO_3-, PRINTER_INFO_4- order PRINTER_INFO_5-Struktur. Leider können diese Strukturen in den Puffer nichtdirekt in eine dieser Strukturen kopiert werden; als Alternative bleibt nur dasmanuelle Kopieren der Werte und Strings anhand eines Pointers wie es im Beispiel gezeigt wird.
cdBufErwartet die Größe des Puffers (pPrinterEnum) in Bytes.
pcbNeededIst der Funktionsaufruf erfolgreich, so wird dieVariable mit der Anzahl der Bytes gefüllt, die in den Puffer kopiert worden sind. Andernfalls wird dieVariable mit der Anzahl der Bytes gefüllt, die der Puffer groß sein muss, um alle Daten empfangen zu können.
pcReturnedIst die Funktion erfolgreich, so wird dieseVariable mit der Anzahl der Drucker-Strukturen in dem Puffer (pPrinterEnum) gefüllt.

flags Konstanten:

Const PRINTER_ENUM_CONNECTIONS = &H4
' (Win NT) PRINTER_INFO_4-Konstante für Informationen über Netzwerkdrucker
 
Const PRINTER_ENUM_DEFAULT = &H1
' (Win 9x) Ermittelt Informationen über den Standarddrucker des Systems
 
Const PRINTER_ENUM_LOCAL = &H2
' Ermittelt alle Lokalen Drucker
 
Const PRINTER_ENUM_NAME = &H8
' Ermittelt alle Drucker anhand des Netzwerknamens (Name-Variable der Funktion)
 
Const PRINTER_ENUM_NETWORK = &H40
' (Win NT) PRINTER_INFO_4-Konstante. Ermittelt alle Netzwerkdrucker einer Domain
 
Const PRINTER_ENUM_REMOTE = &H10
' (Win NT) PRINTER_INFO_4-Konstante. Ermittelt alle Netzwerkdrucker einer Domain
 
Const PRINTER_ENUM_SHARED = &H20
' Ermittelt alle Drucker mit eingeschränktem Zugriff

Rückgabewert:
Ist die Funktion erfolgreich, so wird der Wert "1", andernfalls der Wert "0" zurückgegeben.

Beispiel:

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
Private Declare Sub MoveMemory Lib "kernel32" _
  Alias "RtlMoveMemory" ( _
  pDst  As Any, _
  pSrc As Any, _
  ByVal ByteLen As Long)
Private Declare Function lstrlen Lib "kernel32" _
  Alias "lstrlenA" ( _
  ByVal lpString As Any) As Long
 
Private Const ACL_REVISION = (2) ' AclRevision-Konstante
Private Type ACL
  AclRevision As Byte
  Sbz1 As Byte
  AclSize As Integer
  AceCount As Integer
  Sbz2 As Integer
End Type
 
Private Type SECURITY_DESCRIPTOR
  Revision As Byte
  Sbz1 As Byte
  Control As Long
  Owner As Long
  Group As Long
  Sacl As ACL
  Dacl As ACL
End Type
 
Private Const CCHFORMNAME = 32 ' Pufferlänge-Konstante
Private Const CCHDEVICENAME = 32 ' Pufferlänge-Konstante
Private Type DEVMODE
  dmDeviceName As String * CCHDEVICENAME
  dmSpecVersion As Integer
  dmDriverVersion As Integer
  dmSize As Integer
  dmDriverExtra As Integer
  dmFields As Long
  dmOrientation As Integer
  dmPaperSize As Integer
  dmPaperLength As Integer
  dmPaperWidth As Integer
  dmScale As Integer
  dmCopies As Integer
  dmDefaultSource As Integer
  dmPrintQuality As Integer
  dmColor As Integer
  dmDuplex As Integer
  dmYResolution As Integer
  dmTTOption As Integer
  dmCollate As Integer
  dmFormName As String * CCHFORMNAME
  dmUnusedPadding As Integer
  dmBitsPerPel As Integer
  dmPelsWidth As Long
  dmPelsHeight As Long
  dmDisplayFlags As Long
  dmDisplayFrequency As Long
End Type
 
Private Type PRINTER_INFO_2
  pServerName As String
  pPrinterName As String
  pShareName As String
  pPortName As String
  pDriverName As String
  pComment As String
  pLocation As String
  pDevMode As DEVMODE
  pSepFile As String
  pPrintProcessor As String
  pDatatype As String
  pParameters As String
  pSecurityDescriptor As SECURITY_DESCRIPTOR
  Attributes As Long
  Priority As Long
  DefaultPriority As Long
  StartTime As Long
  UntilTime As Long
  Status As Long
  cJobs As Long
  AveragePPM As Long
End Type
 
 
' PRINTER_INFO_2 Attributes-Konstanten
Private Const PRINTER_ATTRIBUTE_DEFAULT = &H4 ' Der Drucker ist der 'Standarddrucker 
Private Const PRINTER_ATTRIBUTE_DIRECT = &H2 ' Der Drucker hat eine direkte  
' Verbindung mit dem System
Private Const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = &H200 ' Erledigt die Ausdrucke (Jobs)  
' per "First Serve Basis"
Private Const PRINTER_ATTRIBUTE_ENABLE_BIDI = &H800 ' Aktiviert BDI
Private Const PRINTER_ATTRIBUTE_ENABLE_DEVQ = &H80 ' Aktiviert DEVQ
Private Const PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS = &H100 ' Der Drucker hält Informationen von 
' den Ausdrucken (Jobs)
Private Const PRINTER_ATTRIBUTE_QUEUED = &H1 ' Der Drucker unterstützt eine  
' Ausdruckwarteliste
Private Const PRINTER_ATTRIBUTE_SHARED = &H8 ' Der Drucker ist ein Netzwerkdrucker 
Private Const PRINTER_ATTRIBUTE_WORK_OFFLINE = &H400 ' Der Drucker kann offline arbeiten 
 
' PRINTER_INFO_2 Status-Konstanten
Private Const PRINTER_STATUS_BUSY = &H200 ' Der Drucker ist nicht bereit
Private Const PRINTER_STATUS_DOOR_OPEN = &H400000 ' Die Klappe des Druckers ist geöffnet
Private Const PRINTER_STATUS_ERROR = &H2 ' Es liegt ein Druckerfehler vor
Private Const PRINTER_STATUS_INITIALIZING = &H8000 ' Der Drucker wird initialisiert 
Private Const PRINTER_STATUS_IO_ACTIVE = &H100 ' Eine Datenkommunikation mit  
' dem Drucker findet statt
Private Const PRINTER_STATUS_MANUAL_FEED = &H20 ' Der Drucker ladet Papier  
' mit manuellen Papiereinzug nach
Private Const PRINTER_STATUS_NO_TONER = &H40000 ' Der Drucker hat keine Farbe mehr 
Private Const PRINTER_STATUS_NOT_AVAILABLE = &H1000 ' Es kann nicht auf den  
' Drucker zugegriffen werden
Private Const PRINTER_STATUS_OFFLINE = &H80 ' Der Drucker ist offline
Private Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000 ' Der Drucker hat nicht genügend Speicher  
' zum Fortsetzen der letzten Aktion
Private Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800 ' Das Papierausgabefach ist voll 
Private Const PRINTER_STATUS_PAGE_PUNT = &H80000 ' Der Druck wurde wegen zu  
' hoher Komplexität abgebrochen
Private Const PRINTER_STATUS_PAPER_JAM = &H8 ' Das Druckerpapier kann nicht  
' nachgezogen werden
Private Const PRINTER_STATUS_PAPER_OUT = &H10 ' Das Druckerpapier ist leer
Private Const PRINTER_STATUS_PAPER_PROBLEM = &H40 ' Es liegt ein Problem mit  
' der Papierzufuhr vor
Private Const PRINTER_STATUS_PAUSED = &H1 ' (Win NT) Der Drucker befindet  
' sich in einer Pause-Phase
Private Const PRINTER_STATUS_PENDING_DELETION = &H4 ' (Win NT) Die Ausdrucke  
' in der Warteschleife werden gelöscht
Private Const PRINTER_STATUS_PRINTING = &H400 ' Der Drucker druckt
Private Const PRINTER_STATUS_PROCESSING = &H4000 ' Der Drucker erhält Informationen 
Private Const PRINTER_STATUS_TONER_LOW = &H20000 ' Die Farbpatronen des 
' Druckers gehen zur Neige
Private Const PRINTER_STATUS_USER_INTERVENTION = &H100000 ' Der Benutzer hat in die  
' Druckeraktion eingegriffen
Private Const PRINTER_STATUS_WAITING = &H2000 ' Der Drucker wartet
Private Const PRINTER_STATUS_WARMING_UP = &H10000 ' Der Drucker wärmt sich auf
' EnumPrinters flags-Konstanten
Private Const PRINTER_ENUM_CONNECTIONS = &H4 ' (Win NT) PRINTER_INFO_4-Konstante 
' für Informationen über Netzwerkdrucker
Private Const PRINTER_ENUM_DEFAULT = &H1 ' (Win 9x) Ermittelt Informationen  
' über den Standarddrucker des Systems
Private Const PRINTER_ENUM_LOCAL = &H2 ' Ermittelt alle Lokalen Drucker
Private Const PRINTER_ENUM_NAME = &H8 ' Ermittelt alle Drucker anhand des  
' Netzwerknamens (Name-Variabel der Funktion)
Private Const PRINTER_ENUM_NETWORK = &H40 ' (Win NT) PRINTER_INFO_4-Konstante.  
' Ermittelt alle Netzwerkdrucker einer Domain
Private Const PRINTER_ENUM_REMOTE = &H10 ' (Win NT) PRINTER_INFO_4-Konstante. 
' Ermittelt alle Netzwerkdrucker einer Domain
Private Const PRINTER_ENUM_SHARED = &H20 ' Ermittelt alle Drucker mit  
' eingeschränktem Zugriff
' Enumeriert alle verfügbaren Drucker
Private Sub Command1_Click()
  Dim Retval As Long, Printers() As PRINTER_INFO_2
  Dim TmpBuffer() As Long, BuffSizeNeed As Long, NumPrinters As Long
 
  ' Alle Druckerinformationen ermitteln
  ReDim TmpBuffer(0)
  Retval = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 2,  _
  TmpBuffer(0), (UBound(TmpBuffer) + 1) * 4, BuffSizeNeed, NumPrinters)
  ReDim TmpBuffer(BuffSizeNeed / 4)
  Retval = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 2,  _
  TmpBuffer(0), (UBound(TmpBuffer) + 1) * 4, BuffSizeNeed, NumPrinters)
 
  ' Die Druckerinformationen manuell in die Strukturen kopieren
  ReDim Printers(NumPrinters - 1)
  For i = 0 To NumPrinters - 1
    With Printers(i)
      CopyStrVar .pServerName, TmpBuffer(i * 21)
      CopyStrVar .pPrinterName, TmpBuffer(i * 21 + 1)
      CopyStrVar .pShareName, TmpBuffer(i * 21 + 2)
      CopyStrVar .pPortName, TmpBuffer(i * 21 + 3)
      CopyStrVar .pDriverName, TmpBuffer(i * 21 + 4)
      CopyStrVar .pComment, TmpBuffer(i * 21 + 5)
      CopyStrVar .pLocation, TmpBuffer(i * 21 + 6)
      MoveMemory .pDevMode, TmpBuffer(i * 21 + 7), Len(.pDevMode)
      CopyStrVar .pSepFile, TmpBuffer(i * 21 + 8)
      CopyStrVar .pPrintProcessor, TmpBuffer(i * 21 + 9)
      CopyStrVar .pDatatype, TmpBuffer(i * 21 + 10)
      CopyStrVar .pParameters, TmpBuffer(i * 21 + 11)
      If TmpBuffer(i * 21 + 12) << 0 Then MoveMemory  _
      .pSecurityDescriptor, ByVal TmpBuffer(i * 21 + 12), Len(.pSecurityDescriptor) 
      .Attributes = TmpBuffer(i * 21 + 13)
      .Priority = TmpBuffer(i * 21 + 14)
      .DefaultPriority = TmpBuffer(i * 21 + 15)
      .StartTime = TmpBuffer(i * 21 + 16)
      .UntilTime = TmpBuffer(i * 21 + 17)
      .Status = TmpBuffer(i * 21 + 18)
      .cJobs = TmpBuffer(i * 21 + 19)
      .AveragePPM = TmpBuffer(i * 21 + 20)
 
      ' Druckerinformationen ausgeben
      If CBool(.Attributes And PRINTER_ATTRIBUTE_DEFAULT) = True Then 
        Debug.Print "Drucker: " & .pPrinterName & " (Standarddrucker)" 
      Else
        Debug.Print "Drucker: " & .pPrinterName
      End If
      Debug.Print "Port: " & .pPortName
      Debug.Print "Treiber: " & .pDriverName
      Debug.Print "Bemerkung: " & .pComment
      Debug.Print "Leistung: " & .AveragePPM & " Seiten pro Minute"
      Debug.Print "- - - - - - - - - - " & vbCrLf
    End With
  Next i
End Sub
' Kopiert einen String anhand eines Pointers in eine String-Variable
Private Function CopyStrVar(ByRef StrDest As String, ByRef VarSrc As Long)
  StrDest = Space(lstrlen(VarSrc))
  MoveMemory ByVal StrDest, ByVal VarSrc, Len(StrDest)
End Function

Diese Seite wurde bereits 13.189 mal aufgerufen.

nach obenzurück
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel