Hallo,
Ja, in VBA blijkt het iets ingewikkelder te zijn.
Option Explicit
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 PrI_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
Const PRINTER_ENUM_LOCAL = &H2
Private Type PrinterInfo
PrI_Flags As Long
PrI_Description As String
PrI_Name As String
PrI_Comment As String
End Type
Sub ListPrinters()
Dim longbuffer() As Long
Dim printinfo() As PrinterInfo
Dim numbytes As Long
Dim numneeded As Long
Dim numprinters As Long
Dim c As Integer, retval As Long
Dim PrinterList As String
numbytes = 3076
ReDim longbuffer(0 To numbytes / 4) As Long
retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
If retval = 0 Then
numbytes = numneeded
ReDim longbuffer(0 To numbytes / 4) As Long
retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
If retval = 0 Then
MsgBox "Could not successfully enumerate the printers."
End
End If
End If
If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PrinterInfo
For c = 0 To numprinters - 1
With printinfo(c)
.PrI_Flags = longbuffer(4 * c)
.PrI_Description = Space(lstrlen(longbuffer(4 * c + 1)))
retval = lstrcpy(.PrI_Description, longbuffer(4 * c + 1))
.PrI_Name = Space(lstrlen(longbuffer(4 * c + 2)))
retval = lstrcpy(.PrI_Name, longbuffer(4 * c + 2))
.PrI_Comment = Space(lstrlen(longbuffer(4 * c + 3)))
retval = lstrcpy(.PrI_Comment, longbuffer(4 * c + 3))
End With
Next c
For c = 0 To numprinters - 1
PrinterList = PrinterList & vbLf & c + 1 & vbTab & printinfo(c).PrI_Name & vbCrLf
Next c
MsgBox PrinterList, 64, "Available printers"
End Sub
De auteur is me onbekend. Sindsdien heb ik de code ook bewerkt voor klaardere structuur. Bij wijze van voorbeeld een MsgBox, maar wellicht wil je liever de listbox om er één te selecteren.
beste groeten,
Erik