看看下面这段程序:
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;
}
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;
}
Api函数名 函数说明 适用范围 W3.x W95 NT
AddPrinterConnection
为当前用户建立与打印机的联系
否
是
是
StartPagePrinter
开始打印机
否
是
是
StartDoc
开始打印作业
是
是
是
StartDocPrinter
开始打印作业
否
是
是
AddPrintProvidor
加入一个打印机支持器
否
是
是
AddForm
加入一个打印机窗体
否
是
是
AddPort
加入一个打印机端口
否
是
是
AddMonitor
加入一个打印机管理器
否
是
是
ShellExecute
打开或打印指定文件
否
是
是
ClosePrinter
关闭打开的打印机
否
是
是
WritePrinter
向打印机输出数据
否
是
是
AddPrinter
在打印机服务器上建立一个打印机
否
是
是
SetAbortProc
设备打印作业的放弃函数
否
是
是
SetPrinter
设置打印机信息
否
是
是
SetPrinterData
设置打印机配置
否
是
是
SetJob
设置打印作业信息
否
是
是
ResetPrinter
设置打印数据类型和设备模式值
否
是
是
DeletePrinterConnection
删除与打印机的连接
否
是
是
DeletePrintProcessor
删除打印机处理器
否
是
是
DeletePrinterDriver
删除打印机驱动程序
否
是
是
DeletePrinter
删除打印机服务器上的打印机
否
是
是
DeleteMonitor
删除打印机监视器
否
是
是
DeletePrintProvidor
删除打印机提供者
否
是
是
DeleteForm
删除打印机窗体层差
否
是
是
AbortPrinter
删除打印机缓冲文件
否
是
是
DeletePort
删除打印机端口
否
是
是
AddJob
启动一个打印作业
否
是
是
AdvancedDocumentProperties
进行打印机高级设置
否
是
是
PrintDlg
建立打印文本对话框
否
是
是
EnumPrintProcessors
枚举已安装的打印机处理器
否
是
是
EnumPrinterDrivers
枚举已安装的打印机驱动程序
否
是
是
EnumPorts
枚举可用打印机端口
否
是
是
EnumPrintProcessorDatatypes
枚举打印机所支持的数据类型
否
是
是
EnumForms
枚举所支持的打印机窗体
否
是
是
AbortDoc
终止一项打印作业
是
是
是
PrinterProperties
修改打印机属性
否
是
是
AddPrintProcessor
将打印处理器复制到打印机服务器中
否
是
是
AddPrinterDriver
将打印机驱动程序复制到打印机服务器中
否
是
是
PrinterMessageBox
显示打印作业出错信息
否
是
是
ConnectToPrinterDlg
显示浏览对话并连接网络打印机
否
是
是
EndPagePrinter
结束打印页
否
是
是
EndDoc
结束打印作业
是
是
是
EndDocPrinter
结束打印作业
否
是
是
StartPage
准备打印机接收数据
是
是
是
WaitForPrinterChange
监测打印机或打印机服务器变化
否
是
是
GetPrintProcessorDirectory
获取打印机驱动处理器路径
否
是
是
GetPrinterDriver
获取打印机驱动程序信息
否
是
是
GetPrinterDriverDirectory
获取打印机驱动程序路径
否
是
是
GetPrinter
获取打印机信息
否
是
是
GetPrinterData
获取打印机配置信息
否
是
是
GetForm
获取打印机窗口信息
否
是
是
EnumJobs
获取打印作业信息
否
是
是
GetJob
获取打印作业信息
否
是
是
OpenPrinter
获取指定打印机的句柄
否
是
是
ReadPrinter
读打印机数据
否
是
是
DocumentProperties
配置打印机设置
否
是
是
ConfigurePort
配置打印机端口
否
是
是