眾所周知,Windows系統(tǒng)的頁(yè)式打印系統(tǒng)有許多好的特性,比如所見(jiàn)即所得、設(shè)備無(wú)關(guān)等等。但是,在一些實(shí)時(shí)性要求很高的工業(yè)控制系統(tǒng)中,需要將系統(tǒng)隨機(jī)出現(xiàn)的信息實(shí)時(shí)地打印出來(lái),要求來(lái)一行打一行,而不能來(lái)一行打一頁(yè),而Windows系統(tǒng)的頁(yè)式打印系統(tǒng)卻很難滿足這樣的應(yīng)用需求。鑒于這個(gè)原因,為了滿足實(shí)時(shí)系統(tǒng)的打印要求,有必要設(shè)計(jì)一個(gè)新的實(shí)時(shí)行式打印系統(tǒng)。下面詳細(xì)介紹如何在Windows 2000/NT上實(shí)現(xiàn)這樣一個(gè)系統(tǒng)。
總體設(shè)計(jì)
實(shí)時(shí)系統(tǒng)的基本要求是實(shí)時(shí)性。本文采用以共享內(nèi)存為中轉(zhuǎn)的打印假脫機(jī)技術(shù),所有的打印操作在內(nèi)存中提交完成,保證了應(yīng)用系統(tǒng)對(duì)打印操作的及時(shí)響應(yīng)。
另一要求是設(shè)備無(wú)關(guān)性,使提交打印的操作盡可能地做到與設(shè)備無(wú)關(guān)。程序不會(huì)因?yàn)榇蛴C(jī)設(shè)備的不同,導(dǎo)致程序有較大的修改。如果打印機(jī)不同,只需加載相應(yīng)的打印驅(qū)動(dòng)程序即可。
總體上實(shí)時(shí)行式打印系統(tǒng)的設(shè)計(jì)分為兩個(gè)部分,一個(gè)是以內(nèi)存為基礎(chǔ)的打印假脫機(jī)部分的設(shè)計(jì);另一個(gè)是實(shí)時(shí)打印驅(qū)動(dòng)層部分的設(shè)計(jì)。
實(shí)時(shí)行打印假脫機(jī)部分
這個(gè)部分的基本原理是使用一個(gè)基于共享內(nèi)存技術(shù)的先入先出隊(duì)列,用來(lái)存儲(chǔ)其他應(yīng)用程序提交的實(shí)時(shí)打印請(qǐng)求。打印進(jìn)程從先入先出的環(huán)形隊(duì)列取出打印請(qǐng)求,經(jīng)過(guò)必要的處理之后,提交給打印驅(qū)動(dòng)部分,由打印驅(qū)動(dòng)部分負(fù)責(zé)驅(qū)動(dòng)相應(yīng)的打印機(jī)輸出。
為滿足其他應(yīng)用程序提交打印請(qǐng)求的需要,在此使用了Windows操作系統(tǒng)提供的共享內(nèi)存技術(shù)。共享內(nèi)存是進(jìn)程之間通信時(shí)用的一種技術(shù),是一種更為標(biāo)準(zhǔn)、更為核心的技術(shù),而且它在不同操作系統(tǒng)平臺(tái)之間的移植性也比較好(Unix系列操作系統(tǒng)也有這種技術(shù))。另一個(gè)好處是提高了實(shí)時(shí)性能,因?yàn)楸苊饬硕啻蝺?nèi)存復(fù)制的系統(tǒng)空間和時(shí)間上的開(kāi)銷。
Windows系統(tǒng)中與創(chuàng)建共享內(nèi)存相關(guān)的系統(tǒng)函數(shù)有CreateFileMapping和MapViewOfFile。
第一個(gè)函數(shù)用來(lái)在系統(tǒng)中創(chuàng)建一塊共享內(nèi)存,并返回共享內(nèi)存的句柄。其參數(shù)說(shuō)明如下:
HANDLE WINAPI CreateFileMapping (
HANDLE hFile,
LPSECUR99vY _ATTRIBUTES lpsa,
DWORD dwPROTECT,
DWORD dwMaxSizeHigh,
DWORD dwMaxSizeLow,
LPCSTR lpszMapName);
hFile為文件句柄,要?jiǎng)?chuàng)建共享內(nèi)存,該參數(shù)必須為0xffffffff; lpsa為安全屬性結(jié)構(gòu)指針; dwPROTECT是頁(yè)保護(hù)標(biāo)識(shí),如PAGE_READONLY,PAGE_READWR99vE等; dwMaxSizeHigh和dwMaxSizeLow共同定義了共享內(nèi)存的尺寸,分別為共享內(nèi)存大小的高32位和低32位; lpszMapName定義了共享內(nèi)存的名字,必須確保其在系統(tǒng)范圍內(nèi)的惟一性。
第二個(gè)函數(shù)用來(lái)將創(chuàng)建的共享內(nèi)存映射到調(diào)用進(jìn)程的地址空間,并返回該地址空間的首地址。其參數(shù)說(shuō)明如下:
MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
hFileMappingObject定義了CreateFileMapping
函數(shù)返回的共享內(nèi)存句柄; dwDesiredAccess定義了共享內(nèi)存的訪問(wèn)模式,如:FILE_MAP_ALL_ACCESS等; dwFileOffsetHigh和dwFileOffsetLow共同定義了共享內(nèi)存起始位置的偏移量,分別為該偏移量的高32位和低32位,通常情況下二者都為零值; dwNumberOfBytesToMap定義了映射到本進(jìn)程地址空間的共享內(nèi)存的字節(jié)數(shù),如果該值為零,則映射所有的共享內(nèi)存。
總體設(shè)計(jì)
實(shí)時(shí)系統(tǒng)的基本要求是實(shí)時(shí)性。本文采用以共享內(nèi)存為中轉(zhuǎn)的打印假脫機(jī)技術(shù),所有的打印操作在內(nèi)存中提交完成,保證了應(yīng)用系統(tǒng)對(duì)打印操作的及時(shí)響應(yīng)。
另一要求是設(shè)備無(wú)關(guān)性,使提交打印的操作盡可能地做到與設(shè)備無(wú)關(guān)。程序不會(huì)因?yàn)榇蛴C(jī)設(shè)備的不同,導(dǎo)致程序有較大的修改。如果打印機(jī)不同,只需加載相應(yīng)的打印驅(qū)動(dòng)程序即可。
總體上實(shí)時(shí)行式打印系統(tǒng)的設(shè)計(jì)分為兩個(gè)部分,一個(gè)是以內(nèi)存為基礎(chǔ)的打印假脫機(jī)部分的設(shè)計(jì);另一個(gè)是實(shí)時(shí)打印驅(qū)動(dòng)層部分的設(shè)計(jì)。
實(shí)時(shí)行打印假脫機(jī)部分
這個(gè)部分的基本原理是使用一個(gè)基于共享內(nèi)存技術(shù)的先入先出隊(duì)列,用來(lái)存儲(chǔ)其他應(yīng)用程序提交的實(shí)時(shí)打印請(qǐng)求。打印進(jìn)程從先入先出的環(huán)形隊(duì)列取出打印請(qǐng)求,經(jīng)過(guò)必要的處理之后,提交給打印驅(qū)動(dòng)部分,由打印驅(qū)動(dòng)部分負(fù)責(zé)驅(qū)動(dòng)相應(yīng)的打印機(jī)輸出。
為滿足其他應(yīng)用程序提交打印請(qǐng)求的需要,在此使用了Windows操作系統(tǒng)提供的共享內(nèi)存技術(shù)。共享內(nèi)存是進(jìn)程之間通信時(shí)用的一種技術(shù),是一種更為標(biāo)準(zhǔn)、更為核心的技術(shù),而且它在不同操作系統(tǒng)平臺(tái)之間的移植性也比較好(Unix系列操作系統(tǒng)也有這種技術(shù))。另一個(gè)好處是提高了實(shí)時(shí)性能,因?yàn)楸苊饬硕啻蝺?nèi)存復(fù)制的系統(tǒng)空間和時(shí)間上的開(kāi)銷。
Windows系統(tǒng)中與創(chuàng)建共享內(nèi)存相關(guān)的系統(tǒng)函數(shù)有CreateFileMapping和MapViewOfFile。
第一個(gè)函數(shù)用來(lái)在系統(tǒng)中創(chuàng)建一塊共享內(nèi)存,并返回共享內(nèi)存的句柄。其參數(shù)說(shuō)明如下:
HANDLE WINAPI CreateFileMapping (
HANDLE hFile,
LPSECUR99vY _ATTRIBUTES lpsa,
DWORD dwPROTECT,
DWORD dwMaxSizeHigh,
DWORD dwMaxSizeLow,
LPCSTR lpszMapName);
hFile為文件句柄,要?jiǎng)?chuàng)建共享內(nèi)存,該參數(shù)必須為0xffffffff; lpsa為安全屬性結(jié)構(gòu)指針; dwPROTECT是頁(yè)保護(hù)標(biāo)識(shí),如PAGE_READONLY,PAGE_READWR99vE等; dwMaxSizeHigh和dwMaxSizeLow共同定義了共享內(nèi)存的尺寸,分別為共享內(nèi)存大小的高32位和低32位; lpszMapName定義了共享內(nèi)存的名字,必須確保其在系統(tǒng)范圍內(nèi)的惟一性。
第二個(gè)函數(shù)用來(lái)將創(chuàng)建的共享內(nèi)存映射到調(diào)用進(jìn)程的地址空間,并返回該地址空間的首地址。其參數(shù)說(shuō)明如下:
MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
hFileMappingObject定義了CreateFileMapping
函數(shù)返回的共享內(nèi)存句柄; dwDesiredAccess定義了共享內(nèi)存的訪問(wèn)模式,如:FILE_MAP_ALL_ACCESS等; dwFileOffsetHigh和dwFileOffsetLow共同定義了共享內(nèi)存起始位置的偏移量,分別為該偏移量的高32位和低32位,通常情況下二者都為零值; dwNumberOfBytesToMap定義了映射到本進(jìn)程地址空間的共享內(nèi)存的字節(jié)數(shù),如果該值為零,則映射所有的共享內(nèi)存。