![]() |
Drucker mit langen Schachtnamen
Hallo
bisher habe ich immer mit
Delphi-Quellcode:
die Schächte eines Druckers ermittelt. Nur liefert DC_BINNAMES nur 24 Zeichen pro Schacht zurück. Bei einem HP Laserjet 1200 sieht die Liste dann so aus:
DeviceCapabilities(PChar(PrinterName), PChar(PPort), DC_BINNAMES, POutput, nil);
Automatisch auswählen Automatische Druckeraus Schacht 1 Manueller Einzug (Schac Was mich stört sind die abgeschnittenen Einträge 2 und 4. Wenn ich hingegen mit einem x-beliebigen Windows Druckersetup Dialog (z.B. über MS Word) mir die Schächte ansehe, sind diese korrekt und in voller Länge zu sehen. Hat jemand eine Idee wie ich auch mit D2007 an die vollständigen Schachtnamen komme? Thx. P.S: Da auch im Metaphors ReportBuilder 10.09 die Schächte abgeschnitten werden, glaube ich, dass das nicht so ganz einfach ist. |
Re: Drucker mit langen Schachtnamen
Habs mir fast schon gedacht, da man auch im Google zu nichts findet.
Werds mal in nem C++ Forum versuchen, da man da ja doch viel intensiver systemnah programmiert. Irgendwie muss es ja gehen. :gruebel: |
Re: Drucker mit langen Schachtnamen
Vielleicht hilft dir dieser VB-Code ja weiter:
Code:
Option Explicit
Private Declare Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As _ String, ByVal lpPort As String, ByVal iIndex As Long, _ lpOutput As Any, ByVal dev As Long) As Long Const DC_BINS = 6 Const DC_BINNAMES = 12 Private Sub Form_Load() Dim X% For X = 0 To Printers.Count - 1 Combo1.AddItem Printers(X).DeviceName Next X Combo1.ListIndex = 0 End Sub Private Sub combo1_Click() Dim Prn As Printer If Combo1.ListIndex > -1 Then For Each Prn In Printers If Prn.DeviceName = Combo1.List(Combo1.ListIndex) Then Call GetBins(Prn) Exit For End If Next End If End Sub Private Sub GetBins(Prn As Printer) Dim X%, p%, AA$, bb$, Bins%, BinList$ Dim PSize$, dX&, dY& Dim BinNums%() Bins = DeviceCapabilities(Prn.DeviceName, Prn.Port, _ DC_BINS, ByVal vbNullString, 0) If Bins Then ReDim BinNums(1 To Bins) Bins = DeviceCapabilities(Prn.DeviceName, Prn.Port, _ DC_BINS, BinNums(1), 0) BinList = String$(24 * Bins, 0) Bins = DeviceCapabilities(Prn.DeviceName, Prn.Port, _ DC_BINNAMES, ByVal BinList, 0) List1.Clear List2.Clear For X = 1 To Bins AA = Mid(BinList, 24 * (X - 1) + 1, 24) p = InStr(AA, vbNullChar) If p Then AA = Left$(AA, p - 1) List1.AddItem AA List2.AddItem BinNums(X) Next X End If End Sub |
Re: Drucker mit langen Schachtnamen
Nicht wirklich. Den die Zeile
Delphi-Quellcode:
ist genau das Problem. Und wenn man den Buffer von 24 Zeichen erhöht, kommt nix vernünftiges raus. Die API 'DeviceCapabilities' gibt da einfach nicht mehr her, zumindest stehts so in der MSDN.
AA = Mid(BinList, 24 * (X - 1) + 1, 24)
Ich vermute ja, dass man direkt auf den Druckertreiber losgehen müsste. |
Re: Drucker mit langen Schachtnamen
Hallo,
das mit den 24 Zeichen ist so, seit es Windows gibt - im Prinzip hat also der Programmierer des Treibers einen Fehler gemacht, wenn er längere Namen vergibt. Ich schätze, um die ganzen Namen auszulesen, muss man an die Struktur heran, in der sie gespeichert sind, und die könnte, im Gegensatz zum API-Aufruf, von Version zu Version anders sein. Aber jede Windows-Version kennt ja ihre eigene Treiberstruktur und kann die Namen daher in ganzer Länge darstellen. Gruss Reinhard |
Re: Drucker mit langen Schachtnamen
Auch auf der MSDN-Seite steht nur etwas von 24 Zeichen
|
Re: Drucker mit langen Schachtnamen
Hallo!
Ich patche in so einem Fall immer den Treiber. z.B. ist beim Epson LQ850 (EP24RES.DLL)der Name für die Schächte irgendwas mit "Erweiterungssonderschacht 1" und "Erweiterungssonderschacht 2". Durch die Begrenzung auf 24 Zeichen heissen die dann beide "Erweiterungssonderschacht", was so unbrauchbar ist. Das Patchen ist mit einem Hex-Editor leicht gemacht! VG Mike |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz