Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Drucker mit VBA auflisten

312 views
Skip to first unread message

Uwe Strunk

unread,
Nov 5, 2000, 3:00:00 AM11/5/00
to

Hallo
Ich suche an einer Möglichkeit alle aktiven Drucker mit Anschluss mit VBA
auflisten zu lassen um nachher alle Drucker ansprechen zu können.Die Drucker
alleine bekomme ich schon angezeigt aber das gewisse etwas fehlt mir noch,
der Anschluss.
Kurzes Beispiel:
so habe ich es
HP DeskJet 400 Printer
so soll es sein
HP DeskJet 400 Printer auf LPT1

Ich bin wie immer für jede Hilfe dankbar

Uwe

Michael Schwimmer

unread,
Nov 5, 2000, 3:00:00 AM11/5/00
to

Uwe Strunk <uwes...@gmx.de> schrieb in im Newsbeitrag:
ePhzbay...@cppssbbsa02.microsoft.com...

> Ich suche an einer Möglichkeit alle aktiven Drucker mit Anschluss mit VBA
> auflisten zu lassen um nachher alle Drucker ansprechen zu können.Die Drucker
> alleine bekomme ich schon angezeigt aber das gewisse etwas fehlt mir noch,
> der Anschluss.

Hallo Uwe,
folgendermaßen:

Private Declare Function lstrcpy Lib "kernel32.dll" Alias _
"lstrcpyA" (ByVal lpString1 As String, _
ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias _
"lstrlenA" (ByVal lpString As Long) As Long
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 Const PRINTER_ENUM_LOCAL = &H2
Private Const PRINTER_ENUM_NETWORK = &H40
Private Const PRINTER_ENUM_CONNECTIONS = &H4
Private Const PRINTER_ENUM_DEFAULT = &H1
Private Const PRINTER_ENUM_REMOTE = &H10
Private Const PRINTER_ENUM_SHARED = &H20

Type PRINTER_INFO_5
pPrinterName As String
pPortName As String
Attributes As Long
DeviceNotSelectedTimeout As Long
TransmissionRetryTimeout As Long
End Type

Private Sub DruckerListe()
Dim arrBuffer() As Long, lngLänge As Long
Dim udtDruckerinfo() As PRINTER_INFO_5
Dim lngzähler As Long, lngAnzahl As Long
Dim lngRück As Long, lngBuffZähler As Long
Dim PrinterTyp As Long, strMeldung As String
ReDim arrBuffer(1)
'PrinterTyp = PRINTER_ENUM_CONNECTIONS
'PrinterTyp = PRINTER_ENUM_DEFAULT
PrinterTyp = PRINTER_ENUM_LOCAL
'Buffergröße ermitteln
lngRück = EnumPrinters(PrinterTyp, _
vbNullString, 1, arrBuffer(0), 0, _
lngLänge, lngAnzahl)
'Buffer bereitstellen
ReDim arrBuffer(0 To (lngLänge + 3) \ 4)
'Infos über Drucker holen
lngRück = EnumPrinters(PrinterTyp, vbNullString, _
5, arrBuffer(0), lngLänge, lngLänge, lngAnzahl)
If lngAnzahl = 0 Then MsgBox "Keine Drucker verfügbar"
ReDim udtDruckerinfo(1 To lngAnzahl)
For lngzähler = 1 To lngAnzahl
'Zeilenumbruch für Liste erzeugen
If lngAnzahl > 1 Then strMeldung = strMeldung & vbCrLf
With udtDruckerinfo(lngzähler)
'Druckername
.pPrinterName = Space(lstrlen(arrBuffer(lngBuffZähler)))
lstrcpy .pPrinterName, arrBuffer(lngBuffZähler)
lngBuffZähler = lngBuffZähler + 1
'Portname
.pPortName = Space(lstrlen(arrBuffer(lngBuffZähler)))
lstrcpy .pPortName, arrBuffer(lngBuffZähler)
lngBuffZähler = lngBuffZähler + 1
'Verschiedene Attribute
.Attributes = arrBuffer(lngBuffZähler * 4)
lngBuffZähler = lngBuffZähler + 1
'Timeout Druckerauswahl (was auch immer das ist?)
.DeviceNotSelectedTimeout = arrBuffer(lngBuffZähler * 4)
lngBuffZähler = lngBuffZähler + 1
'Timeout Übertragung (was auch immer das ist?)
.TransmissionRetryTimeout = arrBuffer(lngBuffZähler * 4)
lngBuffZähler = lngBuffZähler + 1
'String für Liste erzeugen
strMeldung = strMeldung & .pPrinterName
strMeldung = strMeldung & " auf "
strMeldung = strMeldung & .pPortName
End With
Next
'Liste anzeigen
MsgBox strMeldung
End Sub


MfG
Michael


Uwe Strunk

unread,
Nov 6, 2000, 1:00:19 AM11/6/00
to

Hallo Michael
Vielen Dank für die Lösung. Klappt einwandfrei
Uwe


Michael Schwimmer schrieb in Nachricht
<8u4cmg$bop$04$1...@news.t-online.com>...

Uwe Strunk

unread,
Nov 6, 2000, 3:00:00 AM11/6/00
to

Hallo
Die Freude war wohl doch zu früh.Es weden zwar die Drucker aufgelistet aber
die Anschlussbezeichnung ist nicht die richtige.
Kurzes Beispiel:
"Lexmark Optra Color 45 PS2 auf LexmarkOptr45 " so wird es ausgegeben
"Lexmark Optra Color 45 PS2 auf NE01:" das wird zum
Drucken benötigt

wer kann denn noch bei diesem Problem helfen??

vielen Dank

Michael Schwimmer

unread,
Nov 6, 2000, 3:00:00 AM11/6/00
to
Uwe Strunk <uwe.s...@rexnord.de> schrieb in im Newsbeitrag:
uY4x2e8...@cppssbbsa02.microsoft.com...

>
> Hallo
> Die Freude war wohl doch zu früh.Es weden zwar die Drucker aufgelistet aber
> die Anschlussbezeichnung ist nicht die richtige.

Hallo Uwe,
wie schon als Antwort auf deine PM, kann ich
das nicht nachvollziehen. Der Port, der unter

HKEY_LOCAL_MACHINE\System\CurrentControlSet\
control\Print\Printers\DruckerXYZ\

angegeben ist, wird auch geliefert. Vergleiche mal die
Ausgabe mit dem Schlüssel.

Eventuell Fehler bei Copy-Paste?

Wenn du andere Infos über Drucker haben willst, musst du
die Funktion aufbohren, und perversere Strukturen benutzen.
Hier PRINTER_INFO_2

Type PRINTER_INFO_2
pServerName As Long
pPrinterName As Long
pShareName As Long
pPortName As Long
pDriverName As Long
pComment As Long
pLocation As Long
pDevMode As Long
pSepFile As Long
pPrintProcessor As Long
pDatatype As Long
pParameters As Long
pSecurityDescriptor As Long '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


MfG
Michael


0 new messages