Open1

Print Support Application を開発したい

Koichi IidaKoichi Iida

新しくプリンタドライバを開発する手法の1つとして、以下の手法を調査する。
https://blogs.windows.com/japan/2021/07/13/what-s-new-in-windows-11-for-universal-print/

技術的要件としては、UWPで印刷設定画面のような?アプリ(Print Support Application)を開発し、Microsoft IPP Class Driverを使うよう設定されているプリンタに対して、何かしらの追加の設定を行うことができ、かつ、印刷前のデータの加工ができるはず。

参考1
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/devapps/print-support-app-design-guide

まずこの参考1に書かれているサンプルソースのようなものがビルドできるところまで進むのが難しい。
最初のExtensionを記述するためには、マルチインスタンスが有効になっていないとならず、それを有効にするプロジェクトを新規作成するためには、VisualStudio2019に追加でインストールする拡張機能「Microsoft templates.vsix」をインストールしておく必要があり、これをインストールするためには、.NET6(6.0.300)が必要だった。
その上でVisualStudio2019で新規作成→UWPのテンプレートを指定し、Multi Instanceを有効にする。
ただ、そのプロジェクトのApp.xaml及びApp.csは上記URLのような作りになっておらず、ここから先が進まない。。。

参考2
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/devapps/print-support-app-association
アプリ自体の開発は一旦保留にしておいて、どうやって追加しているプリンタとPSAを紐付けるのか調べてみる。拡張INFのサンプルが掲載されているので、それを一旦作ってみる。
PackageFamilyNameが必要だというが、プロジェクト内にそれらしいIDは記載されていない?見ている場所が違うのか?仕方がないので、一旦デバッグ実行してローカルにアプリをインストールしておき、PowerShellでインストールされている全てのPackageFamiliNameをリストアップするコマンドを実行。
結果、package.appxmanifestに書いてあるIdentityタグのNameの値がそれに該当する模様。
HardwareIdの箇所に3機種のプリンタが記載されているので、一番上のCanon ip110を使う想定で進めてみる。実機はないので、一旦Canon ip110があるものとしてプリンタをインストールしてみる。
そうして、プリンタのプロパティを確認すると当然IPPプリンタとして登録しているわけではないので、ハードウェアID及び互換性のあるIDの部分は「PSA_」で始まらないIDとなっているが、拡張INF側のHardwareIdを「PSA_」なしのIDとしてみる。
(ただ、URLをさらに読み進めると記述されているレジストリの設定部分がどうも矛盾している設定内容が書いてあり、理解できないので、その箇所は飛ばす。)
手順には拡張INF(psa.inf)を作成した後、カタログファイルを作るとあるので、Inf2Cat.exeを使い、拡張INFを元にカタログファイルを作成。
次に、そのカタログファイルを上記プロジェクト作成時に自動的に生成されるpfxファイルを使って署名する。これはWDKをインストールしたときに一緒に入っていくるSignTool.exeを使う。
その上で、電子署名したカタログファイル(.cat)をmmcでローカルの信頼できるルート証明書にインポートしておく。
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000YH1PCAW&l=ja-JP

その上で、pnputil.exe を使ってドライバの追加を行う。署名済みカタログファイルは同じフォルダ内に必要。

pnputil.exe /add-driver psa.inf

ここまですると、プリンタのプロパティ内のドライバの詳細に読み込まれているように見える。見えるが、プリンタのプロパティやWord等から印刷してみようとしても何も起きない。恐らく参考1のほうのPSA自体の実装に何も書いていないからではないかと推測するが、まだ世の中に情報があまりないので一旦ここまでとする。