Rubrik: Drucken | 22.03.05 |
EnumPorts-Funktion Diese Funktion enumeriert alle vorhandenen Druckerports. | ||
Betriebssystem: Win95, Win98, WinNT 3.1, Win2000, WinME | Views: 9.440 |
Deklaration:
Declare Function EnumPorts Lib "winspool.drv" _ Alias "EnumPortsA" ( _ ByVal pName As String, _ ByVal Level As Long, _ pPorts As Any, _ ByVal cbBuf As Long, _ pcbNeeded As Long, _ pcReturned As Long) As Long
Beschreibung:
Diese Funktion enumeriert alle vorhandenen Druckerports.
Parameter:
pName | Erwartet den Namen des Systems, auf dem die Druckerports enumeriert werden sollen. Sollen auf demlokalen System die Ports enumeriert werden, dann kann hier "VBNullChar" übergeben werden. |
Level | Erwartet einen Wert der beschreibt, welcheArt von PORT_INFO-Struktur als Puffer übergeben wird. Geben Sie hier denWert "1" an, wenn als Puffer die PORT_INFO_1-Struktur verwendet wird. Andernfalls übergebenSie hier den Wert "2" für die PORT_INFO_2-Struktur. |
pPorts | Erwartet ein Array von "PORT_INFO_X"-Strukturen, das genügend Arrayfelder beinhalten muss, um die Informationen aller Ports zu empfangen. Das X steht hier als Platzhalter für den gewähltenStrukturtyp. |
cbBuf | Erwartet die Größe des übergebenen Puffers in Bytes. |
pcbNeeded | Erwartet eineLong-Variable, die mit der Anzahl der in den Puffer kopierten Bytes gefüllt wird. Wird kein Puffer übergeben, so wird dieseVariable mit der Anzahl der benötigten Bytes gefüllt die der Puffer groß sein muss, um alle Informationen zu empfangen. |
pcReturned | Erwartet eineLong-Variable, die mit der Anzahl der in den Puffer kopierten "PORT_INFO_X"-Strukturen gefüllt wird. Das Xsymbolisiert in dem Falle den gewählten Strukturtyp. |
Rückgabewert:
Ist die Funktion erfolgreich, so wird ein Wert "ungleich 0" zurückgegeben, andernfallswird "0" zurückgegeben. Für erweiterte Fehlerinformationen können Sie die GetLastError-Funktion aufrufen.
Beispiel:
Private Declare Function EnumPorts Lib "winspool.drv" _ Alias "EnumPortsA" ( _ ByVal pName As String, _ ByVal Level As Long, _ pPorts As Any, _ ByVal cbBuf As Long, _ pcbNeeded As Long, _ pcReturned As Long) As Long Private Declare Function ConfigurePort Lib "winspool.drv" _ Alias "ConfigurePortA" ( _ ByVal pName As String, _ ByVal hwnd As Long, _ ByVal pPortName As String) As Long Private Declare Function lstrlen Lib "kernel32" _ Alias "lstrlenA" ( _ ByVal lpString As Any) As Long Private Declare Function lstrcpy Lib "kernel32" _ Alias "lstrcpyA" ( _ ByVal lpString1 As Any, _ ByVal lpString2 As Any) As Long Private Type PORT_INFO_2 pPortName As Long pMonitorName As Long pDescription As Long fPortType As Long Reserved As Long End Type ' PORT_INFO_2 fPortType-Konstanten Private Const PORT_TYPE_WRITE = &H1 ' Schreiben auf dem Port ist möglich Private Const PORT_TYPE_READ = &H2 ' Lesen des Ports ist möglich Private Const PORT_TYPE_REDIRECTED = &H4 ' Der Port ist im Offlinedruck, Schema ist akteviert Private Const PORT_TYPE_NET_ATTACHED = &H8 ' Der Drucker ist ein Netzwerkdrucker ' eine der Standard Fehlerkonstanten Private Const ERROR_CANCELLED = 1223 Dim Ports() As PORT_INFO_2
' String anhand eines Pointers ermitteln Private Function PtrToString(ByVal StringPtr As Long) As String Dim TmpStr As String TmpStr = Space(lstrlen(StringPtr)) Call lstrcpy(TmpStr, StringPtr) PtrToString = TmpStr End Function
' Alle Ports ermitteln und Combobox damit füllen Private Sub Form_Load() Dim Retval As Long, BufferSize As Long Dim CountPorts As Long Dim I As Integer ' Anzahl Ports ermitteln Retval = EnumPorts(vbNullChar, 2, ByVal 0&, 0&, BufferSize, CountPorts) ' Puffer erstellen und Portinfos ermitteln ReDim Ports(BufferSize / Len(Ports(0)) + 1) Retval = EnumPorts(vbNullChar, 2, Ports(0), Len(Ports(0)) * _ (UBound(Ports) + 1), BufferSize, CountPorts) ' Namen jedes Ports ermitteln For I = 0 To CountPorts - 1 Combo1.AddItem PtrToString(Ports(I).pPortName) Next I If Combo1.ListCount < 0 Then Combo1.ListIndex = 0 Else Command1.Enabled = False End If End Sub
' Portinfos ausgeben Private Sub Combo1_Click() With Ports(Combo1.ListIndex) Debug.Print "Port: " & PtrToString(.pPortName) Debug.Print "Beschreibung: " & PtrToString(.pDescription) Debug.Print "Monitor: " & PtrToString(.pMonitorName) Debug.Print vbTab & "Schreiben: " & CBool(PORT_TYPE_WRITE And .fPortType) Debug.Print vbTab & "Lesen: " & CBool(PORT_TYPE_READ And .fPortType) Debug.Print vbTab & "Netzwerkport: " & _ CBool(PORT_TYPE_NET_ATTACHED And .fPortType) Debug.Print vbTab & "Offlinedruck: " & CBool(PORT_TYPE_REDIRECTED _ And .fPortType) Debug.Print vbCrLf & "- - - - - - - - - - - - - - - - - - -" End With End Sub
' Anschluss konfigurieren Private Sub Command1_Click() Dim Retval As Long Retval = ConfigurePort(vbNullString, Me.hwnd, Combo1.Text) If Retval = 0 Then If Err.LastDllError = ERROR_CANCELLED Then MsgBox "Der Dialog wurde abgebrochen.", vbInformation, _ "Dialog geschlossen" Else MsgBox "Der Port ist nicht verfügbar.", vbInformation, _ "Fehler " & Err.LastDllError End If End If End Sub