LL23 Druckeinstellungen modifizieren (z.B. Papierschacht) mit Delphi Code

Ich benötige eine Möglichkeit per Programmcode seitenunabhängig die Druckeinstellungen für alle Druckjobs unserer Software zu ändern, d.h. Drucker, Papierschacht, Duplex etc.! Es geht mit jedoch hauptsächlich um den Papierschacht!

Ich dachte an die Verwendung der Routinen LlGetPrinterFromPrinterFile zum Einlesen der Druckerkonfiguration, modifizieren von DevMode und Schreiben der geänderten Einstellungen mit LlSetPrinterInPrinterFile bei jedem Druckjob. Zunächst fällt auf, dass die Funktion

INT LlGetPrinterFromPrinterFile (HLLJOB hJob, UINT nObjType,
LPCTSTR pszObjName, INT nPrinter, LPTSTR pszPrinter,
LLPUINT pnSizePrn, _PDEVMODE pDM, LLPUINT pnSizeDm);

einen Wert für SizeDm lefert, der viel größer ist (bei mir konkret 8488 Byte) als die Größen der entsprechenden DevMode-Records aus dem WinApi.Windows Unit, was für das Modifizieren einige Fragen aufwirft. Wenn ich den Puffer für DevMode jedoch groß genug mache, dann ist der Funktionsaufruf aber erfolgreich. Dann erfolgt das trickreiche Modifizieren der Einstellungen. Nach dem Schreiben der geänderten Druckerbeschreibungsdatei fällt auf, dass ich den Eintrag “CreateUnknownLayoutAreas=TRUE” zusätzlich zum geänderten Eintrag DEVMODE =… bekomme, die Frage ist nur warum?

Eine weitere Frage ist: Welche Routinen für den Druck sind zu benutzen , damit die neue Druckerbeschreibungsdatei zum Einsatz kommt? Ich hatte bis jetzt _LL23.Print(…) benutzt, was aber nicht funktioniert.

Ich habe dann auch versucht die Druckerbeschreibungsdatei händisch mit dem Designer so zu modifizieren, dass der gewünschte Papierschacht benutzt wird und bekomme eine Datei die absolut verschieden ist, von der vorher per Code erzeugten.

Vielleicht kann jemand mir da einen Tipp geben?!
Vielen Dank im Voraus!

mfg. JD

Wie im Supportcase mit dem Kollegen besprochen, die Größe der DEVMODE-Struktur kann erheblich abweichen. Grund hierfür ist die treiberspezifische ExtraData, die hinter den eigentlichen Membern der DEVMODE-Struktur im Speicher liegt. Daher müssten Ihre Move-Befehle auch die korrekte Größe (“DevModeSize”) verwenden, nicht nur sizeof(Devmode), da ansonsten die Devmode-Struktur ungültig wird. Dies könnte auch erklären, warum die Änderung nicht übernommen wird.

Wenn Sie LlGetPrinterFromPrinterFile mit “nil” für die Puffer aufrufen erhalten Sie die benötigten Puffergrößen in PrinterSize und DevModeSize zurück. Dann können Sie die benötigten Puffer dynamisch über GetMem alloziieren.