daoshi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2722回复:7

windows 打印流程

楼主#
更多 发布于:2003-01-14 17:38
1、应用程序发出调用。两部分 a、作业控制 b、绘图指令
伪码如下:
        HDC hPrintDC=CreateDC(---);

        StartDoc(hPrintDC,lpDocInfo); //作业控制spool组件

//每页相关设置
        StartPage(hPrintDC);

        CreatePen(---);          //输出属性控制 打印机驱动程序
        CreateBrush(----);
        CreateFont(------);

SelectObject(hPrintDC,----);//3个
        
        LineTo(hPrintDC,-----);   //绘图
        TextOut(hPrintDC,----);
        
SelectObject(hPrintDC,----);//3个
 
        EndPage(hPrintDC);

        EndDoc(hPrintDC);
        
        
2、GDI承接上述所有应用程序调用。根据当前设置

A、或将调用转入打印机驱动程序(RAW),或生成绘图原语(EMF)
B、将作业控制调用转入spool组件。

3、Winspool.drv 输出所有spool相关win32 api,RPC的Stubs(残根)。如果远程调用需在这里进行调整。
一些从winspool.drv导出的函数:
GetPrinterA
GetPrinterW
SetPrinterA
SetPrinterW
DeviceCapabilitiesA
DeviceCapabilitiesW
GetJobA
GetJobW
AddJobA
AddJobW

上述程序中主要用到作业控制函数如AddJob等,由系统调控调用顺序和过程。如果当前格式为emf则协同GDI用绘图原语渲染页面。
如果每页需要有自己不同的设置。则需要调用打印机设置函数如SetPrinter等。

4、Spoolsv.exe 服务器转发Winspool.drv的调用。

5、基于句柄和打印机名决定那个Print Provider被调用。

6、Print Provider 实做大部分spool函数。  

7、Print Processors 把脱机数据(EMF)转为仿真相关(RAW).

8、Language Monitors 1、提供双向通讯。2、添加作业控制信息到数据流

9、Port Monitors    同核心模式的端口硬件驱动进行通讯。

注:打印机驱动程序负责响应GDI调用,用仿真命令组织页面。
再详细的资料可以参考msdn和ddk

最新喜欢:

PreguntaPregun...
xtall
驱动牛犊
驱动牛犊
  • 注册日期2003-01-08
  • 最后登录2003-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-17 23:23
在此过程中,在哪里可以截获打印任务?
比如说,用监测软件,把送来的打印任务全部暂停,并列表显示,然后选择打印。
我知道,有个WM_SPOOLERSTATUS消息,但用spy++监测却无法捕捉到该消息。
daoshi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-20 08:39
你看一下spooler里那组api可否胜任你的任务
以EnumJobs为索引在msdn中可找到。
其他办法,比较麻烦了恐怕也不是全局性的。
xtall
驱动牛犊
驱动牛犊
  • 注册日期2003-01-08
  • 最后登录2003-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-22 10:47
我找了一些源程序,好象都不能捕捉到WM_SPOOLERSTATUS。
所以我现在放弃用WM_SPOOLERSTATUS消息了,但又有问题了:
我用winspool下的SetPrinter,来设置打印机的工作状态(比如暂停等),但是不起作用。我是在win2000下调试的,是不是只有win9x才行?
nick_azrael
驱动牛犊
驱动牛犊
  • 注册日期2003-02-14
  • 最后登录2003-02-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-14 15:54
严重关注!
如何可以接管win2000的打印?
用什么API?
legendklw
驱动牛犊
驱动牛犊
  • 注册日期2002-10-18
  • 最后登录2009-04-02
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-26 16:17
如果我要监控打印的文件名怎么做啊,我是了好几个API都没有文件名。
daoshi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-27 15:12
看看打印处理器
也许有帮助
watersoft
驱动牛犊
驱动牛犊
  • 注册日期2003-07-14
  • 最后登录2006-09-06
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-15 01:39
你好,daoshi
  怎样在第2步a,硬性规定只生成emf数据流?
谢谢
游客

返回顶部