次の方法で共有


CreatePrintAsyncNotifyChannel 関数 (prnasnot.h)

印刷スプーラーでホストされる印刷コンポーネント (印刷ドライバーやポート モニターなど) と、コンポーネントから通知を受信するアプリケーションとの間に通信チャネルを作成します。

構文

HRESULT CreatePrintAsyncNotifyChannel(
  [in]  PCWSTR                            pszName,
  [in]  PrintAsyncNotificationType        *pNotificationType,
  [in]  PrintAsyncNotifyUserFilter        eUserFilter,
  [in]  PrintAsyncNotifyConversationStyle eConversationStyle,
  [in]  IPrintAsyncNotifyCallback         *pCallback,
  [out] IPrintAsyncNotifyChannel          **ppIAsynchNotification
);

パラメーター

[in] pszName

プリント サーバーまたは印刷キューの名前へのポインター。

[in] pNotificationType

チャネルで送信される通知の種類のデータ スキーマの GUID へのポインター。

[in] eUserFilter

通知を送信するかどうかを指定する値。

  • 印刷スプーラーホスト型プラグイン送信者と同じユーザーとして実行されているアプリケーションのみ。
  • リッスンするアプリケーションのより広範なセット。

[in] eConversationStyle

通信が双方向か一方向かを指定する値。

[in] pCallback

リッスンしているアプリケーションが Print Spooler でホストされるコンポーネントを呼び出すために使用するオブジェクトへのポインター。 方向性kUniDirectional の場合は NULL にする必要があります。

[out] ppIAsynchNotification

新しいチャネルへのポインター。

戻り値

HRESULT 重大度 説明
S_OK SUCCESS 関数は正常に終了しました。
CHANNEL_ALREADY_OPENED ERROR チャネルは既に開かれています。
MAX_CHANNEL_COUNT_EXCEEDED ERROR 指定したキューまたはプリント サーバーに対して、指定した種類の通知に対して既に登録されているリッスン しているアプリケーションの最大数。 既定の最大値は 10,000 です。
 

戻り値は COM エラー コードです。 この関数は操作を正常に完了しても、S_OK以外の HRESULT を返す可能性があるため、SUCCEEDED マクロまたは FAILED マクロを使用して、呼び出しの成功を確認する必要があります。 関数によって返された特定の HRESULT を取得するには、HRESULT_CODE マクロを使用します。

次のコード例は、これらのマクロを使用して戻り値を評価する方法を示しています。

if (SUCCEEDED(hr)){
  //Call was successful 
}

if (FAILED(hr)) {
  // Call failed 
}

if (FAILED(hr)) {
  // Call failed 
  switch (HRESULT_CODE(hr)){
    case CHANNEL_ALREADY_OPENED:
      // Some action 
      break;
    case MAX_CHANNEL_COUNT_EXCEEDED:
      // Some action 
      break;
    default:
      //Default action 
      break;
  }
} else {
  //call succeeded 
}

COM エラー コードの詳細については、「エラー処理」を参照してください。

その他の可能な戻り値については、「 PrintAsyncNotifyError 」を参照してください。

注釈

メモ これはブロック関数または同期関数であり、すぐには返されない可能性があります。 この関数が返す速度は、ネットワークの状態、プリント サーバーの構成、プリンター ドライバーの実装などの実行時の要因によって異なります。これは、アプリケーションの作成時に予測が困難な要因です。 ユーザー インターフェイスとの対話を管理するスレッドからこの関数を呼び出すと、アプリケーションが応答しなくなる可能性があります。
 
コンポーネントは、印刷スプーラーのプロセスで実行されている場合にのみチャネルを開くことができます。 たとえば、アプリケーションがプリンター ドライバーを読み込む場合、ドライバーはチャネルを開くことができませんが、印刷スプーラー内に読み込まれたプリンター ドライバーはチャネルを開くことができます。 リッスンしているアプリケーションは、印刷スプーラーのプロセスの内部または外部に配置できます。

チャネルを閉じるには、 IPrintAsyncNotifyChannel::CloseChannel を呼び出します。ただし、 CreatePrintAsyncNotifyChannel の呼び出しの直後に IPrintAsyncNotifyChannel::CloseChannel を呼び出すことはできません。

IPrintAsyncNotifyChannel::Release() のみを呼び出します。

  1. 以前の IPrintAsyncNotifyChannel::AddRef() 呼び出しと明示的に一致する場合は 。
  2. チャネルが UniDirectional チャネルであり、CreatePrintAsyncNotifyChannel の正常な呼び出しで受信したポインターを破棄する場合。
  3. 場合は、BiDirectional チャネルを作成した後、または IPrintNotifyAsyncCallback::OnEventNotify と の実装で、
    1. IPrintAsyncNotifyChannel::SendNotification または IPrintAsyncNotifyChannel::CloseChannel OR を呼び出さなかった
    2. OR に失敗した IPrintAsyncNotifyChannel::SendNotification または IPrintAsyncNotifyChannel::CloseChannel の呼び出しを再試行しませんでした
    3. サーバー側で、戻り値 NO_LISTENER OR で成功した IPrintAsyncNotifyChannel::SendNotification の呼び出しを再試行しませんでした
    4. クライアント側では、戻り値CHANNEL_ACQUIREDで成功した IPrintAsyncNotifyChannel::SendNotification の呼び出しを再試行しませんでした。

要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー prnasnot.h
Library Winspool.lib
[DLL] Spoolss.dll

こちらもご覧ください

クライアントの権限借用

印刷スプーラー API 関数

印刷