看看下面这段程序:
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;
}

解决方案 »

  1.   

    有关打印的所有windows api:
    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
     配置打印机端口
     否
     是
     是