Windows打印機驅動開發

本文地址:http://www.tongxinmao.com/Article/Detail/id/317

開發打印機驅動程序通常有兩種途徑:一是開發一個完整的驅動程序,二是利用微軟提供的通用打印機驅動程序( Unidrv )  
開發小型驅動程序( Minidriver )  
。開發一個完整的驅動程序工作量大且過程複雜,因此我們採用通用打印機驅動程序小型驅動程序來開發打印機驅動程序。

 

 

 

在Windows中,打印機驅動的作用是編寫一組接口。應用程序調用的GDI函數會變成相應的DDI函數,打印機驅動提供的這組接口負責將DDI函數轉變爲打印機識別的的指令。至於是通過網口、串口等接口與真實打印機相連接,這是Printer Moniter的職責,而不是Printer Driver的職責。

打印機驅動一般分爲兩個部分。
1.printer graphics DLL  
2.Printer Interface DLL 
printer graphics DLL和Printer Interface DLL都已經編號,並留有plugin的接口。程序員可以編寫相應的plugin。

由於Microsoft提供了Universal Printer Driver,所以編寫驅動變得比較簡單。
增強Universal Printer Driver可以分爲三個部分:
1.增加一個叫做GPD的文件,這個文本定義了一些參數,Universal Printer Driver會讀取這個文件,這個文件又被稱作是Mini Driver。
2.printer graphics DLL相關的plugin被稱爲Rendering Plug-Ins。
3.Printer Interface DLL相關的plugin被稱爲User Interface Plug-Ins。

打印機驅動需要完成如下接口:
DevQueryPrintEx 
DrvConvertDevMode 
。。。
DrvUpgradePrinter
這幾個函數在Universal Printer Driver中分別在UNIDRVUI.DLL和UNIDRV.DLL分別實現。

 

這部分介紹如何編寫Rendering Plug-Ins。

這個plug-in是一個COM組件,需要向系統提供一個IPrintOemUni2接口的COM組件。

其中比較重要的函數是:
1.EnableDriver 
2.DisableDriver 
在EnableDriver中需要註冊一組函數指針數組,這些函數用來hook中相應的DDI解釋部分。這樣就可以改變默認Universal Printer Driver的行爲。

3. 
EnablePDEV創建打印機廠商自定義的數據結構,然後初始化這個數據結構。
4. 
DisablePDEV負責回收這個數據結構的所佔用的內存。

重要數據結構
typedef struct _DEVOBJ { 
  DWORD dwSize;//這個數據結構的大小
  PDEVOEM pdevOEM; 
//自定義OEM數據結構的指針
  HANDLE hEngine;//物理設備的handle 
  HANDLE hPrinter;//打印機句柄
  HANDLE hOEM; 
  PDEVMODE pPublicDM ; 
  PVOID pOEMDM; 
  PDRVPROCS pDrvProcs; 
} DEVOBJ; 


5. 
GetInfo函數是負責得到一些打印機的一些信息。

6.PublishDriverInterface 
這個函數可以在其中得到IPrintOemDriverUni接口指針,這個指針非常有用,可以調用Universal Printer Driver提供的一些功能。
如向打印機輸出命令,DrvWriteSpoolBuf。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章