Rubrik: Drucken | 22.03.05 |
EnumPrinters-Funktion Diese Funktion ermittelt alle vorhanden Drucker des Systems oder eines Netzwerkrechners. | ||
Betriebssystem: Win95, Win98, WinNT 3.1, Win2000, WinME | Views: 13.207 |
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:
flags | Erwartet eine oder eine Kombination aus mehreren der "flags"-Konstanten die beschreiben, welcheArten von Druckern ermittelt werden sollen. |
name | Erwartet 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. |
Level | Erwartet 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. |
pPrinterEnum | Erwartet 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. |
cdBuf | Erwartet die Größe des Puffers (pPrinterEnum) in Bytes. |
pcbNeeded | Ist 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. |
pcReturned | Ist 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