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.