看看下面这段程序:
CPrintSettings m_prn_setting1;
if( !m_prn_setting1.ValidDevMode()) {
ShowMessage("Printer1 not set");
return;
}
if(m_prn_setting1.SetPrinterDevice(m_prn_setting1.GetPrinterName()) )
ShowMessage("Global settings for printer1 changed!");
else
ShowMessage("Error changing global printer1 settings");
上述类的成员函数定义:
BOOL CPrinterSettings::SetPrinterDevice(LPCTSTR pszDeviceName) const
{
HANDLE hPrinter;
int ret = 0;
PRINTER_DEFAULTS pd;
ZeroMemory(&pd, sizeof(pd));
// because of SetPrinter we need all access
pd.DesiredAccess = PRINTER_ALL_ACCESS;
if (OpenPrinter((char *) pszDeviceName, &hPrinter, &pd) == FALSE)
return FALSE;
DWORD dwBytesReturned, dwBytesNeeded;
GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);
PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR,dwBytesNeeded);
if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded,&dwBytesReturned) == 0) {
GlobalFree(p2);
ClosePrinter(hPrinter);
return FALSE;
}
// Lock handle for DEVMODE and copy DEVMODE data to PRINTER_INFO_2.
// (Instead you can change DEVMODE-fields at p2->pDevMode directly)
DEVMODE* pDevMode = (DEVMODE*) GlobalLock(m_hDevMode);
int dwsize = sizeof(*p2->pDevMode);
//CopyMemory(p2->pDevMode,pDevMode, sizeof(*p2->pDevMode));
CopyDevmode(p2->pDevMode,pDevMode);
// same for DEVNAMES.
DEVNAMES* lpDevNames = (LPDEVNAMES)GlobalLock(m_hDevNames);
LPTSTR lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;
// check to see if our settings are valid
ret = DocumentProperties(NULL,hPrinter,lpszDeviceName,NULL,pDevMode,DM_IN_BUFFER);
p2->pSecurityDescriptor = NULL;
// p2->Attributes = 0;
p2->Priority = 0;
// change settings
if(IDOK == ret)
ret = SetPrinter(hPrinter,2,(LPBYTE)p2,0);
GlobalFree(p2); // free PRINTER_INFO_2.
GlobalUnlock(m_hDevMode);
GlobalUnlock(m_hDevNames);
ClosePrinter(hPrinter);
// Notification: settings changed
SendMessage(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
(LPARAM)pszDeviceName);
return ret;
}