PSS ID Number: 157629
Article Last Modified on 6/29/2004
SetPrinter(HANDLE hPrinter, DWORD dwLevel, LPBYTE lpbPrinter, DWORD
dwCommand)
#include "stdio.h"
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID
lpReserved)
{
return 1;
UNREFERENCED_PARAMETER(hInst);
UNREFERENCED_PARAMETER(ul_reason_being_called);
UNREFERENCED_PARAMETER(lpReserved);
}
#define ErrReturn if (GetLastError()) {ClosePrinter(hPrinter);
printf("error"); return -1;}
short FindID(LPPRINTER_INFO_2 pPrinter, int flg);
BOOL MyFreeMem(LPVOID pMem)
{
return VirtualFree(pMem, 0, MEM_RELEASE);
}
#define UPPER_BIN 1
#define LOWER_BIN 2
int APIENTRY chgbin(char *ptrname, int flg)
{
HANDLE hPrinter = NULL;
DWORD cbBuf;
DWORD pcbNeeded = 0;
LPTSTR pPrintername;
short nSource;
pPrintername = ptrname;
PRINTER_DEFAULTS pd;
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
int result1 = OpenPrinter(pPrintername,&hPrinter, &pd);
ErrReturn;
int result = GetPrinter(hPrinter, 2, NULL, 0, &pcbNeeded);
DWORD Error = GetLastError( );
if( Error == ERROR_INSUFFICIENT_BUFFER )
{
BOOL bRet = FALSE;
HANDLE hMem = NULL;
LPPRINTER_INFO_2 pPrinter;
hMem = GlobalAlloc(GHND, pcbNeeded);
if (hMem) pPrinter = (LPPRINTER_INFO_2)GlobalLock(hMem);
cbBuf = pcbNeeded;
DWORD cbNeeded;
if (GetPrinter(hPrinter, 2, (LPBYTE)pPrinter, pcbNeeded, &cbNeeded))
{
if ((nSource = FindID(pPrinter,flg)) < 0) return -1;
pPrinter->pDevMode->dmDefaultSource = nSource;
pPrinter->pDevMode->dmFields = DM_DEFAULTSOURCE;
DocumentProperties(NULL,hPrinter,pPrintername,pPrinter-
>pDevMode,pPrinter->pDevMode,
DM_IN_BUFFER|DM_OUT_BUFFER);
SetPrinter(hPrinter,2,(unsigned char *)pPrinter,0);
MyFreeMem(pPrinter);
ClosePrinter(hPrinter);
}
}
Error = GetLastError( );
return 0;
}
typedef struct _tagDevCaps
{
TCHAR pPrinterName[80];
TCHAR pPort[80];
WORD wCurCap;
WORD wCurPlatForm;
HINSTANCE hDriver; //only used if on Win32s;
DWORD (CALLBACK* pfnDevCaps) (
LPTSTR pDevice, // address of device-name string
LPTSTR pPort, // address of port-name string
UINT fwCapability, // device capability to query
LPTSTR pOutput, // address of the output
LPDEVMODE pDevMode // address of structure with device data
);
} DEVCAPS;
LPVOID MyAllocMem(DWORD cb)
{
return VirtualAlloc(NULL, cb, MEM_RESERVE|MEM_COMMIT,
PAGE_READWRITE);
}
#define MAX_AMOUNT 256
#define MAX_BINS 16
short FindID(LPPRINTER_INFO_2 pPrinter, int flg)
{
DEVCAPS MyDevCaps;
MyDevCaps.hDriver = NULL;
MyDevCaps.pfnDevCaps = NULL;
BOOL bRet = FALSE;
lstrcpy(MyDevCaps.pPrinterName, pPrinter->pPrinterName);
lstrcpy(MyDevCaps.pPort, pPrinter->pPortName);
MyDevCaps.pfnDevCaps = (LPFNDEVCAPS)&DeviceCapabilities;
DWORD dwBufSize = 0;
BOOL bResult = 1;
WORD FAR *pawBinList;
if (MyDevCaps.pfnDevCaps)
{
// get number of bins
dwBufSize = MyDevCaps.pfnDevCaps ((LPTSTR
)MyDevCaps.pPrinterName,
(LPTSTR )MyDevCaps.pPort, (WORD)DC_BINS,
(LPTSTR )NULL, (LPDEVMODE)NULL);
pawBinList = (WORD FAR *)MyAllocMem(dwBufSize* (sizeof(WORD)));
// fill buffer with bin list
MyDevCaps.pfnDevCaps ((LPTSTR )MyDevCaps.pPrinterName, (LPTSTR
)MyDevCaps.pPort, (WORD)DC_BINS,
(LPTSTR )pawBinList, (LPDEVMODE)NULL);
// display bin info
// protects from bad drivers
if ((dwBufSize > 0) && (dwBufSize < MAX_AMOUNT))
{
for (int i=0; i< (int)dwBufSize;i++)
{
if (pawBinList[i] < MAX_AMOUNT)
{
if (pawBinList[i] < MAX_BINS)
{
if (flg == UPPER_BIN && pawBinList[i] == UPPER_BIN)
return (pawBinList[i]);
else if (flg == LOWER_BIN && pawBinList[i] == LOWER_BIN)
return (pawBinList[i]);
}
}
}
}
// clean up
MyFreeMem(pawBinList);
return (-1);
}
return (-1);
}
DECLARE integer chgbin IN c:\bin.DLL STRING, INTEGER
** 1 = Upper 2 = Lower
retval = chgbin("HP LaserJet 4Si MX",2)
USE CUSTOMER
LIST TO PRINT
133163 How To Control Printer Attributes for a Report at Run Time
Keywords: kbhowto kbprint KB157629
Technology: kbAudDeveloper kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP600Search kbVFPsearch