首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

web调用atl写的com组件打印,该如何处理

2012-01-10 
web调用atl写的com组件打印我在atl中主要写了这个函数STDMETHODIMP CFirst_ATL::InitPrintertest(){char s

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!

热点排行