ShellExecute と「印刷」動詞を使用して、関連するアプリケーションを使用してさまざまな種類のファイルを印刷する必要があるアプリケーションがあります。私のアプリケーションは、1 つの印刷ジョブがいつ完全に処理され、次の印刷ジョブを発行できるかを (できれば) 確実に知る必要があります。FindNextPrinterChangeNotification を使用してこれを実現し、USB 経由でインストールされたローカル プリンターを使用してすべてが正常に動作するように見えますが、ネットワーク プリンターが関係している場合はまったく異なる動作になります。
私のクライアントの 1 つは、ネットワーク プリンターで私のアプリケーションを使用しました。つまり、独自のプリント サーバーが組み込まれたプロフェッショナル プリンターであり、Windows Server 2008 R2 にインストールされ、Windows を使用してこのインストールされたプリンターをクライアントに共有しました。このシナリオでは、FindNextPrinterChangeNotification は常に成功を返しましたが、フラグ PRINTER_NOTIFY_INFO_DISCARDED も常に設定された構造体が返されました。Windows Server 2008 R2 でこの動作を再現できました。この動作は、独自の組み込みプリンター サーバーでプリンターをエクスポートせず、単にローカルにインストールされた FreePDF XP でした。さらに、Ubuntu 開発サーバーの 1 つで samba、cups、cups-pdf を使用すると、同じ動作が得られます。応用、
私の顧客はその後、プリンターの組み込み印刷サーバーを介してクライアントに直接プリンターをインストールし、印刷アプリケーションがローカルプリンターと同じように機能するようになったと私に言いました。私のアプリケーションの彼のバージョンのように PRINTER_NOTIFY_INFO_DISCARDED フラグが設定されたイベントがこれ以上ないことを意味します。これは、アプリケーションを終了するエラー状態です。
もう一度 cups-pdf を使用して再現しようとしましたが、今回は Samba によってエクスポートされたプリンターをインストールするのではなく、URL http://domain.example.org:631/printers/を使用して cups のプリンター名を直接指定してインストールしました。 PDF . このプリンターを Windows で正常に使用できますが、アプリケーションで再び奇妙なイベントが発生します。今回は PRINTER_NOTIFY_INFO_DISCARDED フラグを設定して結果を取得しませんが、ppPrinterNotifyInfo は常に NULL です。結果はまったく得られませんが、FindNextPrinterChangeNotification は正常に返されます。
Microsoft は、ファイアウォールとプリンター通知がクライアントによってブロックされる可能性があることについてのメモを提供していますが、ファイアウォールを無効にして同じシナリオを既にテストしているため、これが私の場合の問題ではないと思います。ファイアウォールを有効にした場合、結果は方法によって異なります私の開発マシンはプリンターと通信しており、私の Windows 7 ファイアウォール設定はデフォルトでプリンター通信を許可しているようです。
簡単に言うと、さまざまなネットワーク プリンターに対するプリンター通知の信頼性については何も見つかりませんでした。すべてはプリンタードライバーに依存していますか?Samba がプリンターをエクスポートするか、http を直接使用するかによって違いが生じるため、そうではないようです。私が読んだことによると、Windows 7 は印刷ジョブのクライアント レンダリングを使用し、その後ジョブをネットワーク スプーラーに送信します。ローカル スプーラーでこれらのジョブを長時間見ることができます。通知が届かないのはなぜですか? Samba とプリンターは、Windows Server を使用して共有されるように設計されており、プリンター通知を発行することは想定されていませんか? と言う情報は見つかりませんでした。
これに関するいくつかの光を提供できるドキュメントの助けやヒントを本当に感謝します。ありがとう!