folgenden Code habe ich geschrieben um alle auf dem System installierte Drucker zu ermitteln. Soweit so gut. Jetzt versuch ich aber den Standarddrucker zu ermitteln (siehe Funktion SelectDefaultPrinter()). Aber irgendwie klappt das nicht, d. h. es wird kein Drucker mit dem Attribut PRINTER_ATTRIBUTE_DEFAULT gefunden.
In der API-Doku ist das Feld Attributes der PRINTER_INFO_2-Struktur ein DWORD. Könnte es damit zusammenhängen, dass PureBasic vorzeichenlose Datentypen nicht unterstützt?
Wär nett, wenn sich das jemand anschauen könnte.
Code: Alles auswählen
EnableExplicit
Structure SPrinterInfo
ServerName.s
PrinterName.s
ShareName.s
PortName.s
DriverName.s
Comment.s
Location.s
SepFile.s
PrintProcessor.s
Datatype.s
Parameters.s
Attributes.l
Priority.l
DefaultPriority.l
StartTime.l
UntilTime.l
Status.l
Jobs.l
AveragePPM.l
EndStructure
Global NewList EnumeratedPrinters.SPrinterInfo()
Procedure.s NotNull(str.l)
Protected s$
If str = #Null : s$ = "" : Else : s$ = PeekS(str) : EndIf
ProcedureReturn s$
EndProcedure
; Die Flags scheinen nicht zu funktionieren ?!?
Procedure SelectDefaultPrinter()
If CountList(EnumeratedPrinters()) = 0 : ProcedureReturn : EndIf
ForEach EnumeratedPrinters()
If (EnumeratedPrinters()\Attributes & #PRINTER_ATTRIBUTE_DEFAULT) <> #PRINTER_ATTRIBUTE_DEFAULT
Break
EndIf
Next
EndProcedure
Procedure GeneratePrinterInfo(*p.PRINTER_INFO_2, *s.SPrinterInfo)
*s\ServerName = NotNull(*p\pServerName)
*s\PrinterName = NotNull(*p\pPrinterName)
*s\ShareName = NotNull(*p\pShareName)
*s\PortName = NotNull(*p\pPortName)
*s\DriverName = NotNull(*p\pDriverName)
*s\Location = NotNull(*p\pLocation)
*s\SepFile = NotNull(*p\pSepFile)
*s\PrintProcessor = NotNull(*p\pPrintProcessor)
*s\Datatype = NotNull(*p\pDatatype)
*s\Parameters = NotNull(*p\pParameters)
*s\Attributes = *p\Attributes
*s\Priority = *p\Priority
*s\DefaultPriority = *p\DefaultPriority
*s\StartTime = *p\StartTime
*s\UntilTime = *p\UntilTime
*s\Status = *p\Status
*s\Jobs = *p\cJobs
*s\AveragePPM = *p\AveragePPM
EndProcedure
Procedure AddToPrintersList(*p.PRINTER_INFO_2)
AddElement(EnumeratedPrinters())
GeneratePrinterInfo(*p, @EnumeratedPrinters())
EndProcedure
Procedure.l EnumPrintersEx(level.l, *name.s)
Protected i.l, *mem.l
Protected p.PRINTER_INFO_2
Protected needed.l, returned.l, size.l
If Not EnumPrinters_(level, *name, 2, #Null, 0, @needed, @returned)
If needed > 0
*mem = AllocateMemory(needed)
Else
ProcedureReturn GetLastError_()
EndIf
EndIf
If Not EnumPrinters_(level, *name, 2, *mem, MemorySize(*mem), @needed, @returned)
FreeMemory(*mem)
ProcedureReturn GetLastError_()
EndIf
For i = 1 To returned
CopyMemory(*mem + (i-1) * SizeOf(PRINTER_INFO_2), p, SizeOf(PRINTER_INFO_2))
AddToPrintersList(p)
Next
FreeMemory(*mem)
ProcedureReturn #ERROR_SUCCESS
EndProcedure
Procedure.l EnumPrinters()
Protected ret.l = #ERROR_SUCCESS
ClearList(EnumeratedPrinters())
If ret <> #ERROR_SUCCESS : ProcedureReturn ret : EndIf
ret = EnumPrintersEx(#PRINTER_ENUM_LOCAL, #Null)
If ret <> #ERROR_SUCCESS : ProcedureReturn ret : EndIf
ret = EnumPrintersEx(#PRINTER_ENUM_CONNECTIONS, #Null)
If ret <> #ERROR_SUCCESS : ProcedureReturn ret : EndIf
SortStructuredList(EnumeratedPrinters(), 2, OffsetOf(SPrinterInfo\PrinterName), #PB_Sort_String)
SelectDefaultPrinter()
ProcedureReturn #ERROR_SUCCESS
EndProcedure
#DEBUG_ENUM_PRINTERS = 1
CompilerIf Defined(DEBUG_ENUM_PRINTERS, #PB_Constant)
Define def.SPrinterInfo
EnumPrinters()
Debug "Anzahl der installierten Drucker: " + Str(CountList(EnumeratedPrinters()))
Debug ""
Debug "Default: " + EnumeratedPrinters()\PrinterName
Debug ""
ForEach EnumeratedPrinters()
Debug "ServerName: " + EnumeratedPrinters()\ServerName
Debug "PrinterName: " + EnumeratedPrinters()\PrinterName
Debug "ShareName: " + EnumeratedPrinters()\ShareName
Debug "PortName: " + EnumeratedPrinters()\PortName
Debug "DriverName: " + EnumeratedPrinters()\DriverName
Debug "Comment: " + EnumeratedPrinters()\Comment
Debug "Location: " + EnumeratedPrinters()\Location
Debug "SepFile: " + EnumeratedPrinters()\SepFile
Debug "PrintProcessor: " + EnumeratedPrinters()\PrintProcessor
Debug "Datatype: " + EnumeratedPrinters()\Datatype
Debug "Parameters: " + EnumeratedPrinters()\Parameters
Debug "Attributes: " + Str(EnumeratedPrinters()\Attributes)
Debug "Priority: " + Str(EnumeratedPrinters()\Priority)
Debug "DefaultPriority: " + Str(EnumeratedPrinters()\DefaultPriority)
Debug "StartTime: " + Str(EnumeratedPrinters()\StartTime)
Debug "UntilTime: " + Str(EnumeratedPrinters()\UntilTime)
Debug "Status: " + Str(EnumeratedPrinters()\Status)
Debug "Jobs: " + Str(EnumeratedPrinters()\Jobs)
Debug "AveragePPM: " + Str(EnumeratedPrinters()\AveragePPM)
Debug "======================================================"
Next
End
CompilerEndIf