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

指向对象的指针,侦听应用程序将使用该指针调用打印后台处理程序托管的组件。 如果方向性kUniDirectional,则此值应为 NULL

[out] ppIAsynchNotification

指向新通道的指针。

返回值

HRESULT 严重性 含义
S_OK 成功 函数已成功完成。
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. 如果在创建双向通道后或在 IPrintNotifyAsyncCallback::OnEventNotify 的实现中和:
    1. 未调用 IPrintAsyncNotifyChannel::SendNotification 或 IPrintAsyncNotifyChannel::CloseChannel OR
    2. 未重试调用 IPrintAsyncNotifyChannel::SendNotification 或 IPrintAsyncNotifyChannel::CloseChannel 失败或
    3. 在服务器端,你没有重试对 IPrintAsyncNotifyChannel::SendNotification 的调用,该调用成功且返回值NO_LISTENER OR
    4. 在客户端上,你没有重试对 IPrintAsyncNotifyChannel::SendNotification 的调用,该调用成功且返回值CHANNEL_ACQUIRED。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 prnasnot.h
Library Winspool.lib
DLL Spoolss.dll

另请参阅

客户端模拟

打印后台处理程序 API 函数

打印