Print to special printer tray with List & Label and Win API

Jochen0911

New Member
Hi,
i print labels with List & Label.

Sample:
run LlSetPrinterInPrinterFile (output nRet, hJob, {&LL_PROJECT_LABEL}, gcLabel, -1, gcDrucker, 0).

The target is, to say the printer, to print with tray 1 or 2 or ...

The documentation described, it´s possible with the last parameter. In my example '0'.

0 is standig for DevMode. Devmode ist Windows API.

procedure LlSetPrinterInPrinterFile external "{&CMLL19_DLLNAME}" ordinal 204 {&CMLL19_PERSISTENT}:
define return parameter rc as LONG.
define input parameter hLlJob as LONG no-undo.
define input parameter nLLTyp as LONG no-undo.
define input parameter nLLFile as character no-undo.
define input parameter lldummy as LONG no-undo.
define input parameter llprinter as character no-undo.
define input parameter devmode as LONG no-undo.
end.

Progress DevMode

But i cannot handle it. I don´t know what´s the meaning of it all and how to use it.

Is there a sample, how to do that?

Thank you,
Jochen
 

Jochen0911

New Member
Code:
/* WIN API */
PROCEDURE OpenPrinterA EXTERNAL "winspool.drv" :
  DEFINE INPUT  PARAMETER pPrinterName AS CHARACTER.
  DEFINE OUTPUT PARAMETER phPrinter    AS LONG.
  DEFINE INPUT  PARAMETER pDefault     AS LONG.
  DEFINE RETURN PARAMETER nullpointer  AS LONG.
END PROCEDURE.
PROCEDURE ClosePrinter EXTERNAL "winspool.drv" :
  DEFINE INPUT  PARAMETER hPrinter    AS LONG.
  DEFINE RETURN PARAMETER nullpointer AS LONG.
END PROCEDURE.
PROCEDURE DocumentPropertiesA EXTERNAL "winspool.drv" :
  DEFINE INPUT  PARAMETER HWND           AS LONG.
  DEFINE INPUT  PARAMETER hPrinter       AS LONG.
  DEFINE INPUT  PARAMETER pDeviceName    AS CHARACTER.
  DEFINE INPUT  PARAMETER pDevmodeOutput AS LONG.
  DEFINE INPUT  PARAMETER pDevmodeInput  AS LONG.
  DEFINE INPUT  PARAMETER fMode          AS LONG.
  DEFINE RETURN PARAMETER ReturnValue    AS LONG.
END PROCEDURE.
PROCEDURE GlobalLock EXTERNAL "kernel32.dll":
    DEFINE INPUT PARAMETER hMem AS LONG.    /* 64-bit AVM: INT64 */
    DEFINE RETURN PARAMETER hAddr AS LONG.  /* 64-bit AVM: INT64 */
END PROCEDURE.
PROCEDURE GlobalUnlock EXTERNAL "kernel32.dll":
    DEFINE INPUT PARAMETER hMem AS LONG.    /* 64-bit AVM: INT64 */
    DEFINE RETURN PARAMETER bResult AS LONG.
END PROCEDURE.
&global DM_SPECVERSION &H320
/* Fields */
&global DM_ORIENTATION = &H1&
&global DM_PAPERSIZE = &H2&
&global DM_PAPERLENGTH = &H4&
&global DM_PAPERWIDTH = &H8&
&global DM_SCALE = &H10&
&global DM_COPIES = &H100&
&global DM_DEFAULTSOURCE = &H200&
&global DM_PRINTQUALITY = &H400&
&global DM_COLOR = &H800&
&global DM_DUPLEX = &H1000&
&global DM_YRESOLUTION = &H2000&
&global DM_TTOPTION = &H4000&
&global DM_COLLATE As Long = &H8000
&global DM_FORMNAME As Long = &H10000
 
/*orientation selections */
&global DMORIENT_PORTRAIT = 1
&global DMORIENT_LANDSCAPE = 2
 
/*paper selections */
&global DMPAPER_LETTER = 1
&global DMPAPER_FIRST = DMPAPER_LETTER     '  Letter 8 1/2 x 11 in
&global DMPAPER_LETTERSMALL = 2            '  Letter Small 8 1/2 x 11 in
&global DMPAPER_TABLOID = 3                '  Tabloid 11 x 17 in
 
/*print qualities */
&global DMRES_DRAFT = (-1)
&global DMRES_LOW = (-2)
&global DMRES_MEDIUM = (-3)
&global DMRES_HIGH = (-4)
 
/*dmDisplayFlags flags */
&global DM_GRAYSCALE = &H1
&global DM_INTERLACED = &H2
&GLOB DM_OUT_BUFFER 2
&GLOB DM_IN_BUFFER 8
&GLOB CCHDEVICENAME 32
&GLOB DM_ORIENTATION 1
&GLOB DMORIENT_LANDSCAPE 2
&GLOB DMORIENT_PORTRAIT 1
&GLOB HP_TRAY_1 259
&GLOB HP_TRAY_2 260
&GLOB HP_TRAY_3 261
def var gvc_drucker  as char   no-undo.
def var gvc_label    as char   no-undo.
def var dmfields     as int    no-undo.
def var gvi_return   as int    no-undo.
def var hJob         as int    no-undo.
def var nRet         as int    no-undo.
def var gvi_kopien   as int    no-undo.
def var gvi_devmode  as int64  no-undo.
def var gvi_maske    as int    no-undo.
def var nSize        as int64  no-undo.
def var gvh_printer  as int no-undo.
def var gvr_dev_mode as raw    no-undo.
def var gmp_defaultdevmode as memptr no-undo.
def var gmp_devmode        as memptr no-undo.
def var bResult as int no-undo.
DEFINE VARIABLE nCopiesOffset AS INTEGER NO-UNDO.
DEFINE VARIABLE hDevModeOffset AS INTEGER NO-UNDO.
DEFINE VARIABLE dmFieldsOffset AS INTEGER NO-UNDO.
DEFINE VARIABLE dmOrientationOffset AS INTEGER NO-UNDO.
DEFINE VARIABLE dmPaperSizeOffset AS INTEGER NO-UNDO.
     DEFINE VARIABLE dmOrientation AS INTEGER NO-UNDO.
    DEFINE VARIABLE dmPaperSize AS INTEGER NO-UNDO.
/* Values for 32-bit 10.2B06 or later */
nCopiesOffset = 33.
hDevModeOffset = 9.
dmFieldsOffset = 73.
dmOrientationOffset = 77.
dmPaperSizeOffset = 79.
 
/* Values for 32-bit before 10.2B06 */
assign
  gvc_drucker = 'DEUSH-PRN006' /* 'DEUSH-Test-HP'  'PDFCreator':U */
  gvc_label   = 'C:\Program Files (x86)\combit\LL19\Programmierbare Beispiele und Deklarationen\Visual Basic\RTF Example\rtf.lbl':U.
run LlJobOpen(output hJob, {&CMBTLANG_GERMAN}).
run LlSetOptionString (output nRet, hJob, {&LL_OPTIONSTR_LICENSINGINFO}, "SW/YDg").
/* Prüfung auf Plausibilität der Daten unterbinden */
run LlSetOption (output nRet, hJob, {&LL_OPTION_XLATVARNAMES}, 0).
run LlSetOption (output nRet, hJob, {&LL_OPTION_NOPARAMETERCHECK}, 1).
run LlSetOption (output nRet, hJob, {&LL_OPTION_COMPRESSSTORAGE}, 0).
run LlSetOption (output nRet, hJob, {&LL_OPTION_NOPRINTERPATHCHECK}, 1).
run LlSetFileExtensions (output nRet, hJob, {&LL_PROJECT_LABEL}, 'lbl':U, 'lbp_':U + replace(replace(gvc_drucker, {&pa-backslash}, '_':U), ' ':U, '_':U), 'lbv':U).
/* zurücksetzen der Variablen */
/* es ist zu prüfen, ob dieser Code ebenfalls innerhalb der Verarbeitung */
/* durchgeführt werden muss, um Chaching zu vermeiden                    */
run LlDefineVariableStart(hJob).
run LlDefineFieldStart(hJob).

/* ***** List&Label VARIABLENDEKLARATION DUMMY START ***** */
RUN OpenPrinterA (gvc_drucker,OUTPUT gvh_printer,0, OUTPUT gvi_return).
if gvi_return = 0
then do:
  message 'Fehler'.
  return.
end.

/* Wie gross ist die DEV-Mode Struktur */
run DocumentPropertiesA (0, gvh_printer,
                         gvc_drucker,
                         0,
                         0,
                         0,
                         output gvi_return).

set-size(gmp_defaultdevmode) = gvi_return.

/* Holt die Default-Einstellungen DEVMODE  */
run DocumentPropertiesA (0, gvh_printer,
                         gvc_drucker,
                         GET-POINTER-VALUE(gmp_defaultdevmode),
                         0,
                         {&DM_OUT_BUFFER},
                         output gvi_return).
copy-lob gmp_defaultdevmode to file ('c:\temp\test1.txt').

/* PUT-SHORT(gmp_defaultdevmode, 57) = 259. */
 PUT-SHORT(gmp_defaultdevmode, 55) = 2.

copy-lob gmp_defaultdevmode to file ('c:\temp\test2.txt').

/* create a merged devmode: */
RUN DocumentPropertiesA (0, 0,
                        gvc_drucker,
                        GET-POINTER-VALUE(gmp_defaultdevmode),
                        GET-POINTER-VALUE(gmp_defaultdevmode),
                        {&DM_IN_BUFFER} + {&DM_OUT_BUFFER},
                        output gvi_return).

copy-lob gmp_defaultdevmode to file ('c:\temp\test3.txt').

/* gvi_devmode = GET-POINTER-VALUE(gmp_defaultdevmode). */
run DocumentPropertiesA (0, 0,
                         gvc_drucker,
                         GET-POINTER-VALUE(gmp_defaultdevmode),
                         0,
                         {&DM_OUT_BUFFER},
                         output gvi_return).
                        
copy-lob gmp_defaultdevmode to file ('c:\temp\test4.txt').

run LlSetPrinterInPrinterFile (output nRet, hJob, {&LL_PROJECT_LABEL}, gvc_label, -1, gvc_drucker, GET-POINTER-VALUE(gmp_defaultdevmode) ).

/* Starten des Drucks */
run LlSetOption (output nRet, hJob, {&LL_OPTION_NOPRINTERPATHCHECK}, 1).  /* XXX NOCHMALIGER AUFRUF */
run LlPrintStart  (output nRet, hJob, {&LL_PROJECT_LABEL}, gvc_label, {&LL_PRINT_USERSELECT}, 0).


Hi guy´s.
I´am confusing. There are no explaining examples in internet and i nee help.
Somehow i´am wrong, but i have not the experience to say where. So hopefully one of your professionals can see, what´s going wrong and get me a tipp.
I simple example is to change the copy of print sides. So, don´t really know, wether with pdfcreator is that working, but also to print to a physical printer, nothing changed. But in the gmp_defaultdevmode something changed. The size of PDF was also changing, but no 2 sides.
After that i want to try out the tray control.
Thank you,
Jochen
 

Attachments

  • 2021-09-15 17_49_53-deush-pnb257@ad - AnyDesk.png
    2021-09-15 17_49_53-deush-pnb257@ad - AnyDesk.png
    118.3 KB · Views: 6
Last edited:
Top