ImagePrinter是一個虛擬打印機,可以將文檔“打印(虛擬打印)”成BMP、PNG、JPG、PDF等格式的文件,功能類似於文檔轉換器,安裝後會成為係統的默認打印機。ImagePrinter的體積隻有900多KB,可以讓低版本的office支持將文檔打印成圖片。
1、驅動層(Driver)一種。好像是修改Render plug-in什麼的。沒做過。
2、打印假脫機(splooer)層兩種。
(1)自定義打印處理器(PrintProcessor),一般是修改DDK中genprint的例子。將自定義的代碼加入到PrintDocumentOnPrintProcessor中。
(2)在監視(Monitor)層。
打印假脫機(splooer)層兩種的兩種實現方法驅動層一般都用微軟統一驅動程序(UniDrv)。
通過打印測試頁可以了解安裝的打印驅動的各個方麵:驅動程序、端口等。也可以通過打印機的屬性查看。
ImagePrinter是用的自定義端口的形式實現虛擬打印。
ImagePrinter是在Port監視器端的虛擬打印機。
(1)在係統開機時,順序調用以下函數:DllMain--->InitializePrintMonitor--->iEnumPorts(2次,後一次參數都是NULL)--->iOpenPort;
(2)在打印文檔時,順序調用以下函數:iStartDocPort--->iWritePort(很多次)--->iEndDocPort。
以下是DDK的翻譯(根據對代碼的理解,有刪減):
(1)初始化打印監視器
當spooler調用LoadLibrary來加載的打印監視器DLL,係統立即調用DLL的DllEntryPoint函數。可以在此時LisableThreadLibraryCalls,這樣創建和刪除線程時,不必非得這個通知DLL。
每一個DLL都導出一個初始化函數,可以供spooler在調用LoadLibrary後調用。Language monitor DLL和port monitor server DLL導出InitializePrintMonitor2函數。port monitor UI DLL的導出InitializePrintMonitorUI函數。(總共有3中Monitor)。
這兩個初始化函數的作用是返回其他函數(EnumPorts,OpenPort,StartDocPort等所有以下用的函數)的指針,這樣spooler就可以調用它們了。初始化函數也可以執行load time的初始化操作。
InitializePrintMonitor2函數返回一個監視器實例句柄。monitor應分配本地內存來存儲自定義的一些信息,並以此句柄為標識來分配內存。
當spooler第一次啟動時(一般是開機時,如果你開機啟動了spooler服務的話),它會載入所有已安裝的monitor DLL的。所有Monitor的初始化函數調用後,打印後台處理程序調用每個port monitor的EnumPorts函數,其中列舉了monitor支持的端口。monitor支持一個端口,如果端口已被添加到monitor的數據庫。然後打開每個支持的端口。
(2)打開和關閉端口
spooler 通過調用language monitor的OpenPortEx函數打開端口;相對應的Port monitor調用OpenPort函數,language monitor隻返回從Port monitor的OpenPort獲得的句柄。如果沒有language monitor,就直接調Port monitor的OpenPort函數。打開一個端口後不關閉的話,不能再打開。
端口一經打開,打印後台處理程序就可以調用其他函數來打印作業了。這些函數使用OpenPort返回的句柄作為輸入。什麼時候端口關閉呢:係統關機,沒打印任務....
(3)打印打印作業
每個打印作業以StartDocPort開始,以EndDocPort結束。當print processor 調用的spooler的StartDocPrinter EndDocPrinter的函數時,這兩個函數被調用。在這兩個函數調用中間,不定量的WritePort, ReadPort, and GetPrinterDataFromPort函數被調用。
這些函數都需要用到OpenPortEx(或OpenPort)返回的句柄( port handle)作為輸入參數。
當spooler調用language monitor 的WritePort函數,以將數據流發送到端口時,這些函數一般隻增加一些特定的語言信息到接收到的數據流上,如PJL命令然後將它傳遞給相關的port monitor的WritePort功能。
ReadPort函數是用於獲取雙向打印機硬件的狀態信息。Language monitor 通過調用SetPort將信息發送到spooler,獲得狀態信息。spooler不能調用ReadPort的函數。
如果打印硬件是雙向的,language monitor和port monitor 都應該實現GetPrinterDataFromPort函數。language monitor的GetPrinterDataFromPort函數以注冊表值的名稱為輸入,獲得該名稱的值(通常由調用相關的端口監視器的WritePort和ReadPort功能),並返回值給調用者。port monitor 的GetPrinterDataFromPort函數應該接受一個I / O控製代碼作為輸入,調用DeviceIoControl返回控製代碼給port driver,並返回結果。
70KB / 03-27
係統其他
下載21.5M / 02-01
遊戲補丁
下載231KB / 09-26
係統優化
下載140.5M / 09-05
76.4M / 03-25
55M / 06-05
237.9M / 04-13
900.9M / 03-02
96.2M / 07-06
311.2M / 07-06
335M / 07-06
200M / 07-06
413.8M / 07-06
484.7M / 09-27
165.4M / 09-05
353.9M / 06-05
131.8M / 04-13
195.6M / 03-03
45.6M / 09-08
665.2M / 07-06
2.84G / 07-06
93M / 07-06
338.3M / 07-06
1.38G / 07-26
488.3M / 07-16
109.8M / 06-03
142M / 01-08
1.2M / 11-23
548.8M / 04-13
1.6M / 04-13
1.48G / 03-18
646.6M / 03-03
133.7M / 03-03
110.5M / 09-05
33.4M / 09-05
325.8M / 08-12
60M / 04-29
254M / 04-25
659M / 04-23
1M / 12-26
253.4M / 12-08
253M / 12-08
1.19G / 11-16
369M / 09-22
181.5M / 09-22
201.2M / 09-05
488.3M / 07-16
248.9M / 12-08
248.9M / 12-08
100.6M / 03-06
148.9M / 03-06
1.12G / 07-06
1.25G / 07-06
1.76G / 09-22
1.92G / 04-17
116.2M / 04-10
201.5M / 04-13
7.31G / 07-01
94.3M / 07-06
2.48G / 07-06
7.63G / 07-06
1M / 07-06
778.1M / 07-06
561.8M / 07-11
72M / 07-06
548.7M / 07-06
1.00G / 07-06
9.13G / 07-06
126.2M / 07-06
72M / 07-06
105.1M / 07-06
132M / 07-06
132M / 07-06