调用打印机打印问题

ren_fwei 2010-10-20 04:22:37
小弟在使用 WritePrinter函数向打印机发送数据时,打印机显示添加了一个新的任务,但是确没有打印出来,请各位高人给看下,代码如下:
bool CRPrinter::DPSendFiletoPrinter(LPCSTR pPrinterName, LPCSTR pFilePath)
{
DWORD tFileSize = 0;
DWORD tReadFileSize = 0;
DWORD size = 0;
char * tBuf = NULL;
HANDLE tPrinter = NULL;
DOC_INFO_1 tDocInfo1; // 打印文档信息

if(pPrinterName == NULL || pFilePath == NULL)
return false;

// 打开打印机
if(!OpenPrinter((LPSTR)pPrinterName,&tPrinter,NULL) || tPrinter == NULL){
return false;
}

memset(&tDocInfo1,0,sizeof(tDocInfo1));
tDocInfo1.pDocName = "my document"; // 文档名
tDocInfo1.pOutputFile = NULL;
tDocInfo1.pDatatype = "RAW"; // 数据以RAW格式发送(Win9x和WinNT都支持RAW和EMF格式,WinNT还支持TEXT格式


if(!StartDocPrinter(tPrinter, 1,(LPBYTE)&tDocInfo1)){
CloseHandle(tPrinter);
return false;
}

StartPagePrinter(tPrinter);

// 打开文件并获取文件大小
HANDLE tFile = CreateFile(pFilePath, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
if(tFile == INVALID_HANDLE_VALUE){
return false;
}
tFileSize = GetFileSize(tFile,NULL);
if(tFileSize == 0xFFFFFFFF){
CloseHandle(tFile);
CloseHandle(tPrinter);
return false;
}

while(tFileSize>0){
size = tFileSize<MAXPRINTSIZE?tFileSize:MAXPRINTSIZE;
tBuf = (char *)malloc(size);
if(tBuf == NULL){
CloseHandle(tFile);
CloseHandle(tPrinter);
return false;
}
memset(tBuf, 0x0, size);

// 读数据
tReadFileSize = 0;
if(!ReadFile(tFile,(LPVOID)tBuf,size,&tReadFileSize,NULL) || size != tReadFileSize){
CloseHandle(tFile);
CloseHandle(tPrinter);
free(tBuf);
return false;
}

// 写入打印机
tReadFileSize = 0;
if(!WritePrinter(tPrinter, tBuf, size, &tReadFileSize) || size != tReadFileSize){
free(tBuf);
CloseHandle(tFile);
CloseHandle(tPrinter);
return false;
}
free(tBuf);

tFileSize = tFileSize - size;
}

//关闭文件
CloseHandle(tFile);

//结束打印,关闭打印机
EndPagePrinter(tPrinter);
if(!EndDocPrinter(tPrinter)){
CloseHandle(tPrinter);
return false;
}
CloseHandle(tPrinter);

return true;
}

执行后打印机状态为已暂停,名为my document的文档没有打印,跪求各位大虾指点
...全文
207 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Veiky_c 2011-07-05
  • 打赏
  • 举报
回复
学到了~~要的就是流程啊啊啊~~~~
sterrys 2010-11-20
  • 打赏
  • 举报
回复
if(!StartDocPrinter(tPrinter, 1,(LPBYTE)&tDocInfo1)){
CloseHandle(tPrinter);
return false;
}
StartPagePrinter(tPrinter);

获取打印机DC
从要打印的文件读取数据
应用程序往打印机dc上绘制内容


guojinlei666 2010-11-11
  • 打赏
  • 举报
回复
我也有个类似的问题,没人给解决
guojinlei666 2010-11-11
  • 打赏
  • 举报
回复
为了挣点积分也得发啊
guojinlei666 2010-11-11
  • 打赏
  • 举报
回复
学习中,,好好看看
会思考的草 2010-11-02
  • 打赏
  • 举报
回复
直接往打印机里面写的话,要写入的内容必须是打印机能识别的东西。

通常情况下,打印流程是这样的:
获取打印机DC->
应用程序往打印机dc上绘制内容->
GDI将内容缓冲到spool file中,格式为emf或者raw->
打印机驱动(printer graphic dll)回放spool file中的图形,翻译成打印机作业语言(PCL,postscript)->
翻译后的结果发往port monitor->
port monitor写入打印机

要么,你自己生成打印机识别的数据格式(PCL, postscript)写入打印机;
要么你借助GDI和打印机驱动,将光栅图像转换成打印机数据,写入打印机。

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧