DJP uses two paths to communicate with the driver. The first path is the preexisting DevEscape. This is hooked out in the dispatch table at location NGreEscape & 0x01FF. The second is a new API DevPostEscape. This is an exported entry point in the .DEF file (OS2_PM_DRV_POSTESCAPE @206).

The prototype for DevEscape follows:

LONG ENGENTRY Escape (HDC       hdc,
                      LONG      lEscape,
                      LONG      cInCount,
                      PBYTE     pInData,
                      PLONG     pcOutCount,
                      PBYTE     pOutData,
                      PDDC      pddc,
                      ULONG     ulFunction)
The prototype for DevPostEscape is:
ULONG APIENTRY OS2_PM_DRV_POSTESCAPE (PSZ       pszDriverName,
                                      PSZ       pszDeviceName,
                                      PSZ       pszQueueName,
                                      PSZ       pszSplPrinterName,
                                      ULONG     ulFuncNum,
                                      ULONG     cbParm1,
                                      PBYTE     pbParm1,
                                      ULONG     cbParm2,
                                      PBYTE     pbParm2)
The following information shows how these two functions are similar (note that most of the parameters are the same).
LONG      lEscape     <===> ULONG     ulFuncNum     *
LONG      cInCount    <===> ULONG     cbParm1
PBYTE     pInData     <===> PBYTE     pbParm1
PLONG     pcOutCount  <===> ULONG     cbParm2
PBYTE     pOutData    <===> PBYTE     pbParm2

The defines and values are different, but the concept is the same.

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³DevEscapes                    ³DevPostEscapes                ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³GreEscape                     ³DEVPE_QUERYSUPPORT            ³
³DEVESC_QUERYESCSUPPORT        ³                              ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³GreEscape DEVESC_QUERYSIZE    ³DEVPE_QUERYSIZE               ³
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
³GreEscape                     ³DEVPE_QUERYJOBPROPERTIES      ³
³DEVESC_QUERYJOBPROPERTIES     ³                              ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

The major difference between DevEscapes and DevPostEscapes is that DevEscape uses an already opened device context handle (HDC), and printer property information is already "hardcoded" at DevOpenDC time. If another device's job properties are passed in, or if another queue's job properties is used with different printer property information, misleading information will be returned.

To overcome this limitation with DevEscape, DevPostEscape passes in four strings with all the information required to find both the printer and job property data. However, DevPostEscape also has a limitation: DevPostEscape behaves like DevPostDeviceModes() in that it loads and unloads the printer driver for each call to DevPostEscape. When DevPostEscape is used before a DevOpenDC() is issued against a specified printer driver, the number of opened instances against the printer driver is 0 (after DevOpenDC, the number will be at least 2 or more). When the number of references is 0, the printer driver will behave as if it is being called for the first time and will load all of its global resources, such as string tables and device data structures. This process can be time consuming, and, if DevPostEscape is called a number of times before DevOpenDC, performance will suffer.


[Back: DJP Design Restrictions]
[Next: Minimum Support for DJP]