LPrint : Windows からの PR201系プリンタ直接制御
概要
Visual Basic 6.0 から NEC 製 PR101/201系プリンタを制御する方法を紹介します。
高価なドットインパクト・プリンタで特有の書式を持った社名入り複写伝票などを出力するような場合、Windows
からシリアル・プリンタを制御するのは、けっこう大変です。Visual Basic の
Printer オブジェクトへの描画は、出力先を代えることで画面に容易に出力イメージを出せたり、機種依存性の排除によって
Windows対応プリンタならどんな機種にも微細な点を除き同一の出力ができるという利点があります。が、逆にプリンタ機種固有の機能が必要なとき、単純には対応できません。また、シリアル・プリンタは基本的に行単位で出力しますが、Windows
のプリンタ取扱いの基本はページ単位であるため連続帳票には向きません。
対策としては市販のプリンタ制御コンポーネントなどを購入するのが常道なのでしょうが、ここでは自前でやってみました。対応機種は
NEC 製 PR101/201系プリンタです。
なお当初、NEC製 N88-日本語BASIC(86) における LPRINT を意識し、名称を
LPrint としましたが、できたものは違うものになってしまいました。
所収ソース
*1. プリンタにはJISコードを渡さなければなりません。LPrint.Bas 中の LPrint
関数を見ていただければわかるように、Visual Basic 6.0 の内部文字コードを
Unicode → Shift-JIS → JIS と変換しています。
なお DllMain 関数は、これ以上ないほど簡単な最小限のものです。マルチスレッドなど一切、考慮していませんのでご注意ください。
生成(コンパイル)法
LPrint.Bas については、そのまま作成しようとするアプリケーションのVBプロジェクトに追加してください。
「Shift-JIS→JIS変換」については上記 SJis2Jis の3ファイルで、Win32 プロジェクトとして
DLL を生成ください(*2)。
*2. Microsoft Visual C++ 6.0 / Microsoft Visual C++ .NET のいずれでも可。VC5などでも可と思われますが、未確認です。
使用法
LPrint.Bas の先頭部分にも記しましたが、LPrint.Bas 所収の各 Function を用いるには次の手順が必要です。
使用手順
1. プリンタのオブジェクトハンドルを取得
lngResult = OpenPrinter(Printer.DeviceName, _
lngPrinterHandle, _
ByVal vbNullString)
2. ドキュメントに関する情報を設定
With udtDOCINFO
.pDocName = App.EXEName
.pOutputFile = vbNullString
.pDatatype = vbNullString
End With
3. 印刷を開始
lngResult = StartDocPrinter(lngPrinterHandle, 1, udtDOCINFO)
lngResult = StartPagePrinter(lngPrinterHandle)
4. プリンタ初期化
lngResult = InitializePrinter(lngPrinterHandle)
5. 印字出力本体実行
bRet = LPrint(lngPrinterHandle, strWrittenData )
6. ページ終了、印刷終了
lngResult = EndPagePrinter(lngPrinterHandle)
lngResult = EndDocPrinter(lngPrinterHandle)
7. プリンタオブジェクトをクローズ
lngResult = ClosePrinter(lngPrinterHandle)
|
LPrint.Bas 所収の関数のごく一部ですが、使い方を下に示します。このようなコードが上記手順の「5.
印字出力本体実行」に相当します。
使われている変数 gdtSei は、請求書データ1件のデータをまとめた構造体(ユーザ定義型)で、その要素はすべて
Unicode 文字列です。また bRet は本来、各関数の正否を示す戻り値を格納する変数ですが、ここでは完全にダミーとなっています(つまり格納値を使っていない)。
使用例
Dim bRet As Boolean 'ここでは bRet は Dummy
Dim lngPHandle As Long
Dim tabset(0 To 3) As Integer
bRet = StartPrint(lngPHandle)
bRet = NewLine(lngPHandle)
bRet = LPrint(lngPHandle, Space$(13) & gdtSei.Zip) '郵便番号
bRet = NewLine(lngPHandle)
bRet = NewLine(lngPHandle)
bRet = LPrint(lngPHandle, Space$(10) & gdtSei.Address) '住所
bRet = NewLine(lngPHandle)
bRet = NewLine(lngPHandle)
'中略
tabset(0) = 29
tabset(1) = 58
tabset(2) = 62
tabset(3) = 65
bRet = SetHorizontalTab(lngPHandle, 4, tabset)
bRet = HTab(lngPHandle)
bRet = LPrint(lngPHandle, gdtSei.Sum) '金額
bRet = HTab(lngPHandle)
'中略
bRet = LPrint(lngPHandle, Space$(14) & "XYZ銀行 ABC支店 当座 9999")
'中略
bRet = FinishPrint(lngPHandle)
|
*3. 実行の際には、生成後の SJis2Jis.DLL(Shift-JIS→JIS変換部)を、パスの通ったフォルダに置いておいてください。使用したアプリケーションの実行ファイル(Exe)と同一フォルダに置くのが簡単ですが、Visual
Basic の開発環境上から動作させるには Visual Basic のシステムフォルダに置かねばなりません。
補注、参考
ソース LPrint.Bas をご覧になられた方なら気づかれたかもしれませんが、一部、ESC/P
モードへ対応させようとしたところがあります。対応させること自体はむずかしくないと思いますが、実験機の都合がつかなかったので、非対応とします。
参考資料:『日本語シリアルプリンタ言語201PL リファレンスマニュアル』日本電気株式会社、日本電気ホームエレクトロニクス株式会社
 |
darokugawa@master.email.ne.jp |
このページ最終更新日 : October 21, 2003 |
|