IPrintAsyncNotifyCallback
COM公式ドキュメント
印刷スプーラーによってホストされるアプリケーションおよびコンポーネントが使用する通信チャネルを作成し、管理します。
解説(Remarks)
アプリケーションが印刷スプーラーでホストされるコンポーネントから通知を受け取るには、通知の登録時に IPrintAsyncNotifyCallback オブジェクトを提供する必要があります。
リッスンしているアプリケーションとの双方向通信チャネルを開く、印刷スプーラーでホストされたコンポーネントは、IPrintAsyncNotifyCallback オブジェクトを提供する必要があります。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定されたチャネルで通知が利用可能になったことをリスナーに知らせます。このメソッドは印刷システムによって呼び出されます。
| pChannel | IPrintAsyncNotifyChannel* | in | 送信側とリスナーが使用するチャネルへのポインター。 |
| pData | IPrintAsyncNotifyDataObject* | in | 通知データと、そのサイズおよび種類を格納するオブジェクトへのポインター。 |
戻り値
| HRESULT | 重大度 | 意味 |
|---|---|---|
| S_OK | SUCCESS | 関数は正常に完了しました。 |
| INTERNAL_NOTIFICATION_QUEUE_IS_FULL | ERROR | 印刷スプーラーはこれ以上キューに通知を保持できません。既定では、キューの最大サイズは 10 個の通知です。このエラーが返される場合、リッスンしているアプリケーションが送信される速度に追いつかずに通知を処理しています。この通知は再送信するか、破棄してください。 |
戻り値は COM エラーコードです。この関数は操作が正常に完了しても S_OK 以外の HRESULT を返す場合があるため、呼び出しの成否を判定するには SUCCEEDED マクロまたは FAILED マクロを使用してください。関数が返した具体的な HRESULT を取得するには、HRESULT_CODE マクロを使用します。
その他の戻り値については PrintAsyncNotifyError を参照してください。
COM エラーコードの詳細については、Error Handling を参照してください。
次のコード例は、これらのマクロを使用して戻り値を評価する方法を示しています。
if (SUCCEEDED(hr)){
// Call was successful
}
if (FAILED(hr)) {
// Call failed
}
if (FAILED(hr)) {
// Call failed, check HRESULT value returned
switch (HRESULT_CODE(hr)){
case INTERNAL_NOTIFICATION_QUEUE_IS_FULL:
// Some action
break;
default:
// Default action
break;
}
} else {
// Call succeeded
}
解説(Remarks)
通知を配信するために、印刷スプーラーは、リッスンしているアプリケーションが通知の登録時に提供した IPrintAsyncNotifyCallback オブジェクトの OnEventNotify メソッドを呼び出します。単方向の通知では、pChannel は NULL です。双方向チャネルでは、pChannel は、リッスンしているアプリケーションが応答として通知を送信するために使用する IPrintAsyncNotifyChannel を指します。リスナーは、IPrintAsyncNotifyChannel の SendNotification メソッドを呼び出すことでこれを行います。
通信チャネルの一方のメンバーに対し、チャネルが閉じられることをもう一方のメンバーに通知するよう指示します。
| pChannel | IPrintAsyncNotifyChannel* | in | 送信側とリスナーが使用するチャネルへのポインター。 |
| pData | IPrintAsyncNotifyDataObject* | in | 通知データまたは応答を格納するオブジェクトへのポインター。 |
戻り値
| HRESULT | 重大度 | 意味 |
|---|---|---|
| S_OK | SUCCESS | この関数は正常に完了しました。 |
| CHANNEL_ALREADY_CLOSED | ERROR | チャネルは既に閉じられています。 |
戻り値は COM エラーコードです。この関数は操作が正常に完了しても S_OK 以外の HRESULT を返す場合があるため、呼び出しの成否を判定するには SUCCEEDED マクロまたは FAILED マクロを使用してください。関数が返した具体的な HRESULT を取得するには、HRESULT_CODE マクロを使用します。
その他の戻り値については PrintAsyncNotifyError を参照してください。
COM エラーコードの詳細については、Error Handling を参照してください。
次のコード例は、これらのマクロを使用して戻り値を評価する方法を示しています。
if (SUCCEEDED(hr)){
// Call was successful
}
if (FAILED(hr)) {
// Call failed
}
if (FAILED(hr)) {
// Call failed, check HRESULT value returned
switch (HRESULT_CODE(hr)){
case CHANNEL_ALREADY_CLOSED:
// Some action
break;
default:
// Default action
break;
}
} else {
// Call succeeded
}
解説(Remarks)
印刷スプーラーによってホストされるコンポーネントが、リッスンしているアプリケーションとの通信チャネルを閉じる場合、そのコンポーネントは、リッスンしているアプリケーションが通知の登録時に提供した IPrintAsyncNotifyCallback オブジェクトの ChannelClosed メソッドを呼び出す必要があります。印刷サーバーがクラッシュした場合、印刷スプーラーは、リッスンしているアプリケーションが提供した IPrintAsyncNotifyCallback オブジェクトの OnEventNotify メソッドの呼び出しを試みます。その際、NOTIFICATION_RELEASE 型の通知が送信されます。
リッスンしているアプリケーションが双方向通信チャネルを閉じる場合、そのアプリケーションは、チャネルの作成時にコンポーネントが提供した IPrintAsyncNotifyCallback オブジェクトの ChannelClosed メソッドを呼び出す必要があります。リッスンしているアプリケーションがクラッシュした場合、印刷スプーラーは、印刷スプーラーによってホストされるコンポーネントが提供した IPrintAsyncNotifyCallback オブジェクトの OnEventNotify メソッドを呼び出します。その際、NOTIFICATION_RELEASE 型の通知が送信されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IPrintAsyncNotifyCallback "{7DEF34C1-9D92-4C99-B3B3-DB94A9D4191B}"
#usecom global IPrintAsyncNotifyCallback IID_IPrintAsyncNotifyCallback "{}"
#comfunc global IPrintAsyncNotifyCallback_OnEventNotify 3 sptr,sptr
#comfunc global IPrintAsyncNotifyCallback_ChannelClosed 4 sptr,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。