FindNextPrinterChangeNotification 関数
FindNextPrinterChangeNotification 関数は、プリンターまたはプリント サーバーに関連付けられている変更通知オブジェクトの最新の変更通知に関する情報を取得します。 変更通知オブジェクトに対する待機操作が満たされた場合に、この関数を呼び出します。
また、この関数は、変更通知オブジェクトをシグナルなし状態にリセットします。 その後、別の待機操作で オブジェクトを使用して、プリンターまたはプリント サーバーの監視を続行できます。 オペレーティング システムは、プリンターまたはプリント サーバーに対して指定された変更セットのいずれかが次に発生した場合に、オブジェクトをシグナル状態に設定します。 FindFirstPrinterChangeNotification 関数は、変更通知オブジェクトを作成し、監視する変更のセットを指定します。
構文
BOOL FindNextPrinterChangeNotification(
_In_ HANDLE hChange,
_Out_opt_ PDWORD pdwChange,
_In_opt_ LPVOID pPrinterNotifyOptions,
_Out_opt_ LPVOID *ppPrinterNotifyInfo
);
パラメーター
-
hChange [in]
-
プリンターまたはプリント サーバーに関連付けられている変更通知オブジェクトへのハンドル。 このようなハンドルを取得するには、 FindFirstPrinterChangeNotification 関数を呼び出します。 オペレーティング システムは、オブジェクトの変更通知フィルターで指定された変更のいずれかを検出すると、この変更通知オブジェクトをシグナル状態に設定します。
-
pdwChange [out, optional]
-
最新の通知の原因として発生した変更を示すためにビットが設定されている変数へのポインター。 設定できるビット フラグは、FindFirstPrinterChangeNotification 呼び出しの fdwFilter パラメーターで指定されたビット フラグに対応します。 システムは、次のビット フラグの 1 つ以上を設定します。
値 説明 - PRINTER_CHANGE_ADD_FORM
フォームがサーバーに追加されました。 - PRINTER_CHANGE_ADD_JOB
印刷ジョブがプリンターに送信されました。 - PRINTER_CHANGE_ADD_PORT
ポートまたはモニターがサーバーに追加されました。 - PRINTER_CHANGE_ADD_PRINT_PROCESSOR
プリント プロセッサがサーバーに追加されました。 - PRINTER_CHANGE_ADD_PRINTER
プリンターがサーバーに追加されました。 - PRINTER_CHANGE_ADD_PRINTER_DRIVER
プリンター ドライバーがサーバーに追加されました。 - PRINTER_CHANGE_CONFIGURE_PORT
サーバーでポートが構成されました。 - PRINTER_CHANGE_DELETE_FORM
フォームがサーバーから削除されました。 - PRINTER_CHANGE_DELETE_JOB
ジョブが削除されました。 - PRINTER_CHANGE_DELETE_PORT
サーバーからポートまたはモニターが削除されました。 - PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
サーバーから印刷プロセッサが削除されました。 - PRINTER_CHANGE_DELETE_PRINTER
プリンターが削除されました。 - PRINTER_CHANGE_DELETE_PRINTER_DRIVER
プリンター ドライバーがサーバーから削除されました。 - PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
プリンター接続に失敗しました。 - PRINTER_CHANGE_SET_FORM
サーバーにフォームが設定されました。 - PRINTER_CHANGE_SET_JOB
ジョブが設定されました。 - PRINTER_CHANGE_SET_PRINTER
プリンターが設定されました。 - PRINTER_CHANGE_SET_PRINTER_DRIVER
プリンター ドライバーが設定されました。 - PRINTER_CHANGE_WRITE_JOB
ジョブ データが書き込まれた。 - PRINTER_CHANGE_TIMEOUT
ジョブがタイムアウトしました。 - PRINTER_CHANGE_SERVER
Windows 7: サーバーで変更が発生しました。 -
pPrinterNotifyOptions [in, optional]
-
PRINTER_NOTIFY_OPTIONS構造体へのポインター。 この構造体の Flags メンバーを PRINTER_NOTIFY_OPTIONS_REFRESHに設定して、監視されているすべてのプリンター情報フィールドの現在のデータを関数が返すようにします。 関数は、構造体の他のすべてのメンバーを無視します。 このパラメーターは、NULL でもかまいません。
-
ppPrinterNotifyInfo [out, optional]
-
システム割り当て読み取り専用バッファーへのポインターを受け取るポインター変数へのポインター。 FreePrinterNotifyInfo 関数を呼び出して、バッファーが終了したらバッファーを解放します。 情報が必要ない場合、このパラメーターは NULL にすることができます 。
バッファーには 、PRINTER_NOTIFY_INFO_DATA 構造体の配列を含む PRINTER_NOTIFY_INFO構造体が 含まれています。 配列の各要素には、FindFirstPrinterChangeNotification 呼び出しの pPrinterNotifyOptions パラメーターで指定されたフィールドの 1 つに関する情報が含まれています。 通常、 関数は、最新の通知を引き起こすために変更されたフィールドに対してのみデータを提供します。 ただし、 pPrinterNotifyOptions パラメーターが指す構造体で PRINTER_NOTIFY_OPTIONS_REFRESHが指定されている場合、関数は監視対象のすべてのフィールドのデータを提供します。
PRINTER_NOTIFY_INFO_DISCARDED ビットがPRINTER_NOTIFY_INFO構造体の Flags メンバーに設定されている場合、オーバーフローまたはエラーが発生し、通知が失われた可能性があります。 この場合、PRINTER_NOTIFY_OPTIONS_REFRESHを指定する 2 回目の FindNextPrinterChangeNotification 呼び出しを行うまで、追加の通知は送信されません。
戻り値
関数が成功した場合、戻り値は 0 以外の値になります。
関数が失敗した場合は、0 を返します。
注釈
注意
これはブロック関数または同期関数であり、すぐには返されない可能性があります。 この関数が返す速度は、ネットワーク状態、プリント サーバーの構成、プリンター ドライバーの実装要因など、アプリケーションの作成時に予測が困難な実行時の要因によって異なります。 ユーザー インターフェイスとの対話を管理するスレッドからこの関数を呼び出すと、アプリケーションが応答しなくなる可能性があります。
FindFirstPrinterChangeNotification によって作成された通知オブジェクトに対する待機操作が満たされた後、FindNextPrinterChangeNotification 関数を呼び出します。 FindNextPrinterChangeNotification を呼び出すと、待機操作を満たす変更に関する情報を取得し、通知オブジェクトをリセットして、次の変更が発生したときに通知されるようにすることができます。
1 つの例外として、変更通知オブジェクトがシグナル状態でない場合は 、FindNextPrinterChangeNotification 関数を呼び出さないでください。 待機関数が WAIT_TIMEOUT値を返す場合、変更オブジェクトはシグナル状態ではありません。 待機関数がタイムアウトせずに成功した場合にのみ、FindNextPrinterChangeNotification 関数を呼び出します。例外は、pPrinterNotifyOptions パラメーターに設定されたPRINTER_NOTIFY_OPTIONS_REFRESH ビットを使用して FindNextPrinterChangeNotification が呼び出されたときです。 このフラグが設定されている場合でも、ppPrinterNotifyInfo パラメーターでPRINTER_NOTIFY_INFO_DISCARDED フラグを設定することはできます。
プリンターまたはプリント サーバーの変更の監視を続けるには、 待機関数 のいずれかを呼び出してから FindNextPrinterChangeNotification 関数を呼び出して変更を確認し、通知オブジェクトをリセットするサイクルを繰り返します。
FindNextPrinterChangeNotification では、同じプリンター情報フィールドに対する複数の変更を 1 つの通知に結合できます。 この場合、この関数は通常、ppPrinterNotifyInfo 内のPRINTER_NOTIFY_INFO_DATA構造体の配列内の 1 つのエントリにフィールドのすべての変更を折りたたみます。1 つのエントリでは、最新の情報のみが報告されます。 ただし、一部のジョブおよびプリンター情報フィールドでは、関数は同じフィールドに対して複数の配列エントリを返すことができます。 この場合、フィールドの最後の配列エントリは現在のデータを報告し、以前のエントリには中間ステージのデータが含まれます。
変更通知オブジェクトが不要になったら、 FindClosePrinterChangeNotification 関数を呼び出して閉じます。
注意
Service Pack 2 (SP2) 以降の Windows XP では、インターネット接続ファイアウォール (ICF) によってプリンター ポートが既定でブロックされますが、ファイルと印刷の共有の例外を有効にできます。 ユーザーが別のコンピューターにプリンター接続を行い、例外が有効になっていない場合、ユーザーはサーバーからプリンター変更通知を受け取りません。 マシン管理者は例外を有効にする必要があります。
例
次のコード サンプルは、これらの関数を使用してプリンターの状態を監視する方法を示しています。
// Get change notification handle for the printer
chgObject = FindFirstPrinterChangeNotification(
hPrinter,
PRINTER_CHANGE_JOB,
0,
NULL);
if (chgObject != INVALID_HANDLE_VALUE) {
while (bKeepMonitoring) {
// Wait for the change notification
WaitForSingleObject(chgObject, INFINITE);
fcnreturn = FindNextPrinterChangeNotification(
chgObject,
pdwChange,
NULL,
NULL);
if (fcnreturn) {
// Check value of *pdwChange and
// deal with the indicated change
}
// Insert some mechanism to stop monitoring
// such as:
//
// if (something happens) {
// bKeepMonitoring = false;
// }
//
}
// Close Printer Change Notification handle when finished.
FindClosePrinterChangeNotification(chgObject);
} else {
// Unable to open printer change notification handle
dwStatus = GetLastError();
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows 2000 Server [デスクトップ アプリのみ] |
ヘッダー |
|
ライブラリ |
|
[DLL] |
|