Get the available paper bins from a printer
Sometimes you might want to find out how many paper bins a printer has. (Thanks to Barbara P for original question, code.)
lcPrinterName = GETPRINTER()
nPrinters=APRINTERS(laAvailPrinters)
FOR i = 1 TO nPrinters
IF UPPER(laAvailPrinters[i,1]) = UPPER(lcPrinterName)
lcPort = laAvailPrinters[i,2]
lcPort = CHRTRAN(lcPort,':','')
EXIT
ENDIF
ENDFOR
?"lcPort",lcPort
?"lcPrinterName",lcPrinterName
#define DC_BINS 6
#define DC_BINNAMES 12
DECLARE INTEGER DeviceCapabilities IN winspool.drv;
STRING pDevice, STRING pPort, INTEGER fwCapability,;
STRING @pOutput, INTEGER pDevMode
DECLARE INTEGER GetLastError IN kernel32
nResult= DeviceCapabilities(lcPrinterName, lcPort, DC_BINS, 0, 0)
IF nResult=-1
?"Err getting DC_BINS size",GetLastError()
RETURN
ENDIF
?nResult
cstr=SPACE(nResult* 2) && WORD is 2 bytes each
nResult=DeviceCapabilities(lcPrinterName, lcPort, DC_BINS, @cstr, 0)
IF nResult=-1
? "Err getting DC_BINS",GetLastError()
ENDIF
nBins=nResult
?"Bins"
DIMENSION aBins[nBins]
FOR i = 1 TO nBins
aBins[i]=CTOBIN(SUBSTR(cstr,i*2-1,2),"2rs")
?aBins[i]
ENDFOR
cstr=SPACE(nBins*24)
nResult=DeviceCapabilities(lcPrinterName, lcPort, DC_BINNAMES, @cstr, 0)
IF nResult=-1
? "Err getting DC_BINNAMES",GetLastError()
ENDIF
FOR i = 1 TO nBins
?CHRTRAN(SUBSTR(cstr,(i-1)*24+1,24),CHR(0),"")
ENDFOR