IPrintAsyncNotifyChannel::SendNotification 方法 (prnasnot.h)
将打印后台处理程序托管的组件中的通知发送到一个或多个侦听应用程序,或将来自应用程序的响应发送回组件。
语法
HRESULT SendNotification(
[in] IPrintAsyncNotifyDataObject *pData
);
参数
[in] pData
指向通知内容及其大小和类型的指针。
返回值
HRESULT | 严重性 | 含义 |
---|---|---|
S_OK | 成功 | 函数已成功完成。 |
ASYNC_CALL_ALREADY_PARKED | ERROR | 无法发送通知,因为收件人尚未使用上一个通知。 |
ASYNC_CALL_IN_PROGRESS | ERROR | 通道正忙于另一个通知或响应。 |
ASYNC_NOTIFICATION_FAILURE | ERROR | 此通道上没有任何侦听器配置为接收此通知类型,或者分配完成此调用所需的资源时出现问题。 |
CHANNEL_ACQUIRED | ERROR | 另一个侦听器已获取此通道。 通知未发送。 原始侦听器将不再接收通知。 |
CHANNEL_ALREADY_CLOSED | ERROR | 无法发送通知,因为在此调用之前通道已关闭。 |
CHANNEL_NOT_OPENED | ERROR | 无法发送通知,因为在此调用之前未打开通道。 |
CHANNEL_WAITING_FOR_CLIENT_NOTIFICATION | ERROR | 无法发送通知,因为尚未收到对最后一个通知的响应。 |
INVALID_NOTIFICATION_TYPE | ERROR | 指定的通知类型无效。 |
MAX_NOTIFICATION_SIZE_EXCEEDED | ERROR | 已超出通知数据的最大大小。 默认情况下,允许的最大数据大小为 10 MB。 |
NO_LISTENERS | 成功 | 指示没有已注册的侦听应用程序。 |
UNIRECTIONAL_NOTIFICATION_LOST | 成功 | 一个或多个侦听器未收到此通知,但至少有一个侦听器收到此通知。 |
返回值为 COM 错误代码。 由于此函数可能成功完成操作,但返回除S_OK以外的 HRESULT,因此应使用 SUCCEEDED 或 FAILED 宏来确定调用是否成功。 若要获取函数返回的特定 HRESULT,请使用 HRESULT_CODE 宏。 下面的代码示例演示如何使用这些宏。
有关其他可能的返回值,请参阅 PrintAsyncNotifyError 。
有关 COM 错误代码的详细信息,请参阅错误处理。
if (SUCCEEDED(hr)) {
// Call succeeded, check HRESULT value returned
switch (HRESULT_CODE(hr)){
case S_OK:
// Some action
break;
case NO_LISTENERS:
// Some action
break;
case UNIRECTIONAL_NOTIFICATION_LOST:
// Some action
break;
default:
// Default action
break;
}
} else {
// Call failed, check HRESULT value returned
switch (HRESULT_CODE(hr)){
case ASYNC_NOTIFICATION_FAILURE:
// Some action
break;
case CHANNEL_ALREADY_CLOSED:
// Some action
break;
case CHANNEL_NOT_OPENED:
// Some action
break;
//
// ... Test for other error cases
//
default:
// Default action
break;
}
}
注解
对于单向通道,如果在打印后台处理程序处理较早的 SendNotification 调用时发出 SendNotification 调用,打印后台处理程序会将挂起的通知排队。 如果打印后台处理程序托管的组件或应用程序调用 IPrintAsyncNotifyChannel::CloseChannel,则会丢弃排队通知。
对于双向通道,如果在 Print-Spooler 处理较早的 SendNotification 调用时发出 SendNotification 调用,则挂起的调用将失败。 在这种情况下,如果调用方是打印后台处理程序中的发送方, 则 SendNotification 将返回CHANNEL_WAITING_FOR_CLIENT_NOTIFICATION。 如果调用方是发送答复的侦听器,则 SendNotification 返回ASYNC_CALL_IN_PROGRESS。
如果同一双向通道存在多个侦听器,则通道上发送的初始通知将传递到所有侦听器。 要答复的第一个侦听器将获取通道。 获取通道后调用 SendNotification 的侦听器将失败,CHANNEL_ACQUIRED出现错误。
在双向通道上接收初始通知的侦听器可能对获取通道不感兴趣。 在这种情况下,侦听器可以调用 IUnknown::Release 方法。 如果调用 SendNotification 或 IPrintAsyncNotifyChannel::CloseChannel 方法,则不需要调用 IUnknown::Release 方法。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] |
目标平台 | Windows |
标头 | prnasnot.h |
DLL | Prnasnot.dll |