現象
InitializePrintMonitor2() をサポートしていないランゲージモニタが、この初期化関数をサポートしているポートモニタに対して、OpenPort() もしくは OpenPortEx() でポートのオープンを要求しても失敗することがあります。
原因
Windows 2000 以降のポートモニタとランゲージモニタでは、InitializePrintMonitor2() で初期化を行うことを推奨しており、この関数以外の初期化は推奨していません。
Windows 8 以前では、InitializePrintMonitor2() で登録したコールバック関数と非推奨の初期化関数で登録したコールバック関数が、混在しているプリント キューにおいて、スプーラーサービスがコールバック関数のインターフェースの変換処理を行っていました。
しかしながら、Windows 8 以降、非推奨の初期化関数で登録したコールバック関数の変換処理を廃止しました。この変換処理の廃止に伴い 、非推奨の初期化関数で実装しているランゲージモニタでは、InitializePrintMonitor2() で初期化するポート モニタの利用ができなくなります。
解決方法
この問題を回避するためには、InitializePrintMonitor2() で初期化を行うランゲージ モニタに移行する必要があります。
詳細
この問題が発生するプリンタ ポートの例としては、Bluetooth ポートやターミナル サービスのリダイレクトポートがあります。
また、USB ポートは特例処理として、インターフェースの変換処理を行う場合があります。
関連情報
InitializeMonitor
InitializeMonitorEx
InitializePrintMonitor function
InitializePrintMonitor2 function