スキップしてメイン コンテンツへ

 none
プリンタドライバ:「Generic / Text Only」の改造 RRS feed

  • 質問

  • プリンタドライバを「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
    2020年2月18日 23:02

回答

  • > (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
    2020年2月19日 2:45

すべての返信

  • > (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
    2020年2月19日 2:45
  • 早速の返答ありがとうございます。

    お礼を申し上げます。

    教えて頂いた情報を元に確認します。

    進展がありましたら、再度投稿します。

    2020年2月20日 23:26