This example code will print out all queues and printers for the local computer. It will print out both printers that are attached to a queue, and those that are direct printers.
#define INCL_SPL #define INCL_SPLDOSPRINT #define INCL_SPLERRORS #include <os2.h> #include <stdio.h> /* for printf function */ INT main () { PVOID pBuf; ULONG fsType ; ULONG cbBuf ; ULONG cRes ; ULONG cTotal ; ULONG cbNeeded ; SPLERR splerr = 0 ; PPRINTERINFO pRes ; /* Set fsType to use all the flags. We will print out local device/queues.*/ fsType = SPL_PR_QUEUE | SPL_PR_DIRECT_DEVICE | SPL_PR_QUEUED_DEVICE | SPL_PR_LOCAL_ONLY; /* Make function call with cbBuf equal to zero to get a return in cbNeeded*/ /* of the number of bytes needed for buffer to hold all the information */ splerr = SplEnumPrinter ( NULL,0 ,fsType ,NULL ,NULL ,&cRes , &cTotal,&cbNeeded ,NULL ) ; /* The error return code will be one of the two following codes if */ /* all the parameters were correct. Otherwise it could be */ /* ERROR_INVALID_PARAMETER. */ if ( splerr == ERROR_MORE_DATA || splerr == NERR_BufTooSmall ) { /* Allocate memory for the buffer using the count of bytes that were */ /* returned in cbNeeded. For simplicity, no error checking is done. */ DosAllocMem( &pBuf, cbNeeded, PAG_READ|PAG_WRITE|PAG_COMMIT); /* Set count of bytes in buffer to value used to allocate buffer. */ cbBuf = cbNeeded; /* Call function again with the correct buffer size. */ splerr = SplEnumPrinter ( NULL,0 ,fsType ,pBuf ,cbBuf ,&cRes , &cTotal,&cbNeeded,NULL); /* If there are any returned structures in the buffer, then we will */ /* print out some of the information. */ if (cRes) { pRes = (PPRINTERINFO)pBuf ; while ( cRes-- ) { /* Look at the flType element in the pRes structure to determine */ /* what type of print destination the structure represents. */ switch (pRes[cRes].flType) { case SPL_PR_QUEUE: printf("Print destination %s is a queue.\n", pRes[cRes].pszPrintDestinationName) ; break; case SPL_PR_QUEUED_DEVICE: printf("Print destination %s is a queued printer.\n", pRes[cRes].pszPrintDestinationName) ; break; case SPL_PR_DIRECT_DEVICE: printf("Print destination %s is a direct printer.\n", pRes[cRes].pszPrintDestinationName) ; } printf("Description - %s\n\n",pRes[cRes].pszDescription) ; } } DosFreeMem(pBuf); } else { /* If we had any other return code other than ERROR_MORE_DATA or */ /* NERR_BufTooSmall, we will print out the following information. */ printf("SplEnumPrinter error= %ld \n",splerr); } DosExit( EXIT_PROCESS , 0 ) ; return (splerr); }