#define SRVQUEUENAME = "\\QUEUES\\SRV_QUEUE" /* Server queue name */ #define REQQUEUENAME = "\\QUEUES\\REQ_QUEUE" /* Requester queue name */ HQUEUE hSrvQueue, hReqQueue; /* Queue handles */ REQUESTDATA Requester; /* Requester win handle */ REQUEST *Request; /* Request data buffer */ REPLY *Reply; /* Reply data buffer */ BYTE Priority; /* Element priority */ ULONG ulBytes; /* Bytes read/written */ APIRET rc; /* Return code */ rc = DosCreateQueue(&hSrvQueue, /* Create queue */ QUE_FIFO | /* First-in, first-out */ QUE_CONVERT_ADDRESS, /* Convert addresses */ SRVQUEUENAME); /* Name of queue */ while (!ProcessEnded) /* Until process ends */ { rc = DosReadQueue(hSrvQueue, /* Read queue */ &Requester, /* Control information */ &ulBytes, /* Bytes read */ &Request, /* Data buffer pointer */ 0, /* Get first element */ DCWW_WAIT, /* Wait synchronously */ &Priority, /* Priority of element */ 0); /* No event semaphore */ ServiceRequest(Request); /* Process request */ rc = DosOpenQueue(&Requester.idpid, /* Open queue */ &hReqQueue, /* Queue handle */ REQQUEUENAME); /* Server queue name */ rc = DosAllocSharedMem(&Reply, /* Allocate shared mem */ NULL, /* object for request */ sizeof(REPLY), /* Size of memory object */ PAG_WRITE | /* Allow write access */ PAG_READ | /* Allow read access */ PAG_COMMIT); /* Commit storage now */ rc = DosGiveSharedMem(Reply, /* Give mem to requester */ &Requester.idpid, /* Req process id */ PAG_READ); /* Allow read only */ rc = DosWriteQueue(hReqQueue, /* Add request to queue */ 0L, /* No control info */ sizeof(REPLY), /* Size of reply */ Reply, /* Reply buffer */ 0); /* No priority */ rc = DosCloseQueue(hReqQueue); /* Close queue */ DosFreeMem(Request); /* Free request buffer */ WinPostMsg((HWND)Requester.ulData, /* Post notification msg */ WMP_REQUESTCOMPLETE, /* to requester window */ (MPARAM)Reply, /* Reply buffer pointer */ 0); DosFreeMem(Reply); /* Free reply buffer */ }
This example shows the creation of a queue and the processing of items from the queue by a "server" process.