web调用atl写的com组件打印
我在atl中主要写了这个函数
STDMETHODIMP CFirst_ATL::InitPrintertest()
{
char szprinter[80];
char *szDevice,*szDriver,*szOutput;
DEVMODE* pDevMode=NULL;
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
static DOCINFO di={sizeof(DOCINFO),"printer",NULL};
// 得到设备字符串存入数组szprinter中
GetProfileString("windows","device",",,,",szprinter,80);
DWORD Errno,buf[2000],len=sizeof(PRINTER_INFO_2);
PRINTER_INFO_2 pinfo2;
TCHAR PrinterName[128];
HANDLE Printer;
LPDEVMODE lpmod;
DEVMODE devmod;
PRINTDLG pda;
PRINTER_DEFAULTS pDefault;
memset(&pda,0,sizeof(pda));
pda.lStructSize = sizeof(pda);
//PD_RETURNDEFAULT使之获得默认打印机的设置且不显示对话框
pda.Flags = PD_RETURNDEFAULT|PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION;
PrintDlg(&pda); // 获得缺省打印机设置
Errno=GetLastError();
if(Errno==ERROR_SUCCESS)
{
if (pda.hDevMode !=NULL)
{
lpmod = (LPDEVMODE)GlobalLock(pda.hDevMode);
strcpy(PrinterName,(char *)lpmod->dmDeviceName );//获得缺省打印机名字
GlobalUnlock(pda.hDevMode);
}
else
{
return false;
}
}
else{
return false;
}
memset(&pDefault,0,sizeof(pDefault));
memset(&devmod,0,sizeof(devmod));
memset(&pinfo2,0,sizeof(pinfo2));
pDefault.DesiredAccess =PRINTER_ALL_ACCESS;
OpenPrinter(PrinterName,&Printer,&pDefault);
Errno=GetLastError();
if(Errno)
{
return false;
}
GetPrinter(Printer,2,(BYTE *)buf,sizeof(buf),&len);
if(Errno)
{
return false;
}
else
{
// 将设备字符串分解
if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&NULL!=(szOutput=strtok(NULL,",")))
// 创建一个打印机设备句柄
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
memcpy((void *)&pinfo2,buf,sizeof(pinfo2));
//pinfo2=mypinfo2;
//pinfo2.pDevMode=&mydevmod;
pinfo2.pDevMode->dmOrientation=1;
ResetDC(hdcprint,pinfo2.pDevMode); //使设置的参数发挥作用
StartDoc(hdcprint,&di); // 启动打印工作
StartPage(hdcprint); // 一页开始
TextOut(hdcprint,0,10,"打印内容",8); //打印内容
EndPage(hdcprint); // 一页结束
EndDoc(hdcprint); // 终止打印工作
if(DeleteDC(hdcprint))
return false; // 删除打印机DC
else
{
return false;
}
}
}
SetPrinter(Printer,2,(unsigned char *)&pinfo2,NULL);
Errno=::GetLastError();
if(Errno)
{
return false;
}
ClosePrinter(Printer);
return true;
}
我在VC的控制台下调用是可以打印的,但在web中调用时发现OpenPrinter(PrinterName,&Printer,&pDefault); 出错了。
我做了些处理知道错误代码是13,就是数据无效。怎样修改才能实现在web打印?
[解决办法]
兄弟不用这么复杂吧,你已经拿到了打印的dc还要自己再去创建?
看看下面代码:
PRINTDLG pd;
HWND hwnd;
// Initialize PRINTDLG
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL; // Don't forget to free or store hDevMode
pd.hDevNames = NULL; // Don't forget to free or store hDevNames
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;
if (PrintDlg(&pd)==TRUE)
{
// pd.hDC就是你要的打印dc了.
// 这里就是你要画打印的东西
// Delete DC
DeleteDC(pd.hDC);
}
///你代码:
STDMETHODIMP CFirst_ATL::InitPrintertest()
{
char szprinter[80];
char *szDevice,*szDriver,*szOutput;
DEVMODE* pDevMode=NULL;
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
static DOCINFO di={sizeof(DOCINFO),"printer",NULL};
// 得到设备字符串存入数组szprinter中
GetProfileString("windows","device",",,,",szprinter,80);
DWORD Errno,buf[2000],len=sizeof(PRINTER_INFO_2);
PRINTER_INFO_2 pinfo2;
TCHAR PrinterName[128];
HANDLE Printer;
LPDEVMODE lpmod;
DEVMODE devmod;
PRINTDLG pda;
PRINTER_DEFAULTS pDefault;
memset(&pda,0,sizeof(pda));
pda.lStructSize = sizeof(pda);
//PD_RETURNDEFAULT使之获得默认打印机的设置且不显示对话框
pda.Flags = PD_RETURNDEFAULT ¦PD_ALLPAGES ¦ PD_USEDEVMODECOPIES ¦ PD_NOPAGENUMS ¦ PD_HIDEPRINTTOFILE ¦ PD_NOSELECTION;
PrintDlg(&pda); // 获得缺省打印机设置
//这里就可以利用pda.hDC去打印了,没有必要再去用OpenPrinter了
//.....
good lucky!