Three primary steps are required to open the printer device:
* Create a message port using createport(). reply messages from the
device must be directed to a message port.
* Create an extended I/O request structure of type printerio with the
createextio() function. this means that one memory area can be used
to represent three distinct forms of memory layout for the three
different types of data structures that must be used to pass commands
to the printer device. By using CreateExtIO(), you automatically
allocate enough memory to hold the largest structure in the union
statement.
* Open the printer device. Call opendevice(), passing the i/o request.
union printerIO
{
struct IOStdReq ios;
struct IODRPReq iodrp;
struct IOPrtCmdReq iopc;
};
struct MsgPort *PrintMP; /* Message port pointer */
union printerIO *PrintIO; /* I/O request pointer */
if (PrintMP=CreateMsgPort() )
if (PrintIO=(union printerIO *)
CreateExtIO(PrintMP,sizeof(union printerIO)) )
if (OpenDevice("printer.device",0L,(struct IORequest *)PrintIO,0))
printf("printer.device did not open\n");
The printer device automatically fills in default settings for all printer
device parameters from Preferences. In addition, information about the
printer itself is placed into the appropriate fields of printerio. (see
the obtaining printer specific data section below.)
Pre-V36 Tasks and opendevice().
-------------------------------
Tasks in pre-V36 versions of the operating system are not able to
safely OpenDevice() the printer device because it may be necessary to
load it in from disk, something only a process could do under
pre-V36. V36 and higher versions of the operating system do not have
such a limitation.