トップ回答者
プリンタドライバ:「Generic / Text Only」の改造

質問
-
プリンタドライバを「Generic / Text Only」を改造してシリアルプリンタにテキストデータ(ASCIIのみ)を送信するドライバの開発を行っています。
WDKのサンプルから「tty」をビルドして、プリンタの追加、USBにシリアル接続された先にテキストデータのみ送信されることまでは、確認できました。
今後行いたいこととしては、以下です。
(1) 余白出力の削除
top, left, bottomに用紙サイズ、アプリ(メモ帳)で設定された余白(改行、空白)が出力されるのを削除したい。
(2) セル、又はカンマ区切り、改行をセパレータ、コマンドに変換
Excel又はメモ帳から出力されたデータをセル単位、又はカンマ区切りをセパレータ(タブ又はコマンド)に変換したい。
行の先頭、末尾にコマンドを追加したい。
(3) IPrintOemUni2::CommandCallback
CommandCallbackを使用したい
しかし、この後どのように進めればよいかわかりません。
(1) 余白出力の削除
(2) セル、又はカンマ区切り、改行をセパレータ、コマンドに変換
ドライバでRAWデータを取得して出力データを変換すればいいように思うが、
どこでRAWデータの取得、設定をすればいいか分からない。
(3) IPrintOemUni2::CommandCallback
CommandCallbackを使用したいが、GPDにCallbackIDを設定して、GetImplementedMethodでS_OKを返しているのに
IPrintOemUni2::CommandCallbackが呼ばれない。CallbackIDを9000とか重複しない値にしてもダメでした。
ドライバ開発初心者で、全く解っていませんが、行き詰まって折、何かヒントでも、何でもいいので、お教えください。
- 編集済み oshira 2020年2月18日 23:03
回答
-
> (1) 余白出力の削除
"tty.gpd" 内の PaperSize 属性定義のとこで、"MasterUnits" および "Resolution" に対応した "TopMargin", "MinLeftMargin", "BottomMargin" を指定するか、あるいは "PrintableArea" での指定で余白部分をなくす。
---------------------------------------------
PaperSize 機能のオプション属性
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/print/option-attributes-for-the-papersize-feature
---------------------------------------------
> (2) セル、又はカンマ区切り、改行をセパレータ、コマンドに変換たぶん、レンダリング プラグイン側の IOemCB::OutputCharStr メソッドに文字列データが渡されてくると思うので、そこで変換すればできるはず。
---------------------------------------------
IPrintOemUni::OutputCharStr method
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/ddi/prcomoem/nf-prcomoem-iprintoemuni-outputcharstr
---------------------------------------------
> (3) IPrintOemUni2::CommandCallback
たぶん、GPD 側での定義がおかしいからだと思います。
理解されていると思いますが、tty のサンプルには レンダリング プラグイン側に IPrintOemUni::CommandCallback メソッドは実装されているけど、GPD 側では使っていないので、オリジナルの状態では呼び出されない。
つまり GPD 側できちんと定義しないと、ちゃんと呼び出されません。
> ドライバ開発初心者で、全く解っていませんが、行き詰まって折、何かヒントでも、何でもいいので、お教えください。
基本的な部分の理解が足りてないと思います。
「初心者」を自覚されているのであれば、まずは下記サイトからきちんと学ばれることをお薦めします。
(もっとも、いまさら v3 アーキテクチャを学んでも。。。。とも思いますが。)
---------------------------------------------
ユニバーサル プリンター ドライバーの概要
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/print/introduction-to-the-universal-printer-driver?redirectedfrom=MSDN
---------------------------------------------- 回答としてマーク oshira 2020年2月20日 23:27
すべての返信
-
> (1) 余白出力の削除
"tty.gpd" 内の PaperSize 属性定義のとこで、"MasterUnits" および "Resolution" に対応した "TopMargin", "MinLeftMargin", "BottomMargin" を指定するか、あるいは "PrintableArea" での指定で余白部分をなくす。
---------------------------------------------
PaperSize 機能のオプション属性
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/print/option-attributes-for-the-papersize-feature
---------------------------------------------
> (2) セル、又はカンマ区切り、改行をセパレータ、コマンドに変換たぶん、レンダリング プラグイン側の IOemCB::OutputCharStr メソッドに文字列データが渡されてくると思うので、そこで変換すればできるはず。
---------------------------------------------
IPrintOemUni::OutputCharStr method
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/ddi/prcomoem/nf-prcomoem-iprintoemuni-outputcharstr
---------------------------------------------
> (3) IPrintOemUni2::CommandCallback
たぶん、GPD 側での定義がおかしいからだと思います。
理解されていると思いますが、tty のサンプルには レンダリング プラグイン側に IPrintOemUni::CommandCallback メソッドは実装されているけど、GPD 側では使っていないので、オリジナルの状態では呼び出されない。
つまり GPD 側できちんと定義しないと、ちゃんと呼び出されません。
> ドライバ開発初心者で、全く解っていませんが、行き詰まって折、何かヒントでも、何でもいいので、お教えください。
基本的な部分の理解が足りてないと思います。
「初心者」を自覚されているのであれば、まずは下記サイトからきちんと学ばれることをお薦めします。
(もっとも、いまさら v3 アーキテクチャを学んでも。。。。とも思いますが。)
---------------------------------------------
ユニバーサル プリンター ドライバーの概要
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/print/introduction-to-the-universal-printer-driver?redirectedfrom=MSDN
---------------------------------------------- 回答としてマーク oshira 2020年2月20日 23:27