Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Drucker mit langen Schachtnamen (https://www.delphipraxis.net/128470-drucker-mit-langen-schachtnamen.html)

Eurowig 30. Jan 2009 12:10


Drucker mit langen Schachtnamen
 
Hallo

bisher habe ich immer mit
Delphi-Quellcode:
DeviceCapabilities(PChar(PrinterName), PChar(PPort), DC_BINNAMES, POutput, nil);
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:

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.

Eurowig 3. Feb 2009 07:53

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:

Morphie 3. Feb 2009 07:57

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

Eurowig 3. Feb 2009 08:37

Re: Drucker mit langen Schachtnamen
 
Nicht wirklich. Den die Zeile

Delphi-Quellcode:
AA = Mid(BinList, 24 * (X - 1) + 1, 24)
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.

Ich vermute ja, dass man direkt auf den Druckertreiber losgehen müsste.

Reinhard Kern 3. Feb 2009 13:30

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

inherited 3. Feb 2009 13:55

Re: Drucker mit langen Schachtnamen
 
Auch auf der MSDN-Seite steht nur etwas von 24 Zeichen

LikeMike 24. Mär 2009 10:57

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 18:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz