描述
从Print Spooler托管的组件发送通知给一个或多个监听应用程序,或将应用程序的响应发送回组件。
C++ 语法
HRESULT SendNotification( [in] IPrintAsyncNotifyDataObject *pData ); |
PowerBASIC 语法
METHOD SendNotification ( _ BYVAL pData AS IPrintAsyncNotifyDataObject _ ) AS LONG |
参数
pData
[in]指向通知内容及其大小和类型的指针。
返回值
HRESULT: S_OK
严重: SUCCESS
含义:功能已成功完成。
HRESULT: ASYNC_CALL_ALREADY_PARKED
严重: ERROR
含义:无法发送通知,因为收件人尚未消除先前的通知。
HRESULT: ASYNC_CALL_IN_PROGRESS
严重: ERROR
含义:频道正在忙于另一个通知或响应。
HRESULT: ASYNC_NOTIFICATION_FAILURE
严重: ERROR
含义:发送此通知时出现问题。此频道上的任何收听者都没有配置为接收此通知类型,或者分配完成此呼叫所需的资源时出现问题。
HRESULT: CHANNEL_ACQUIRED
严重: ERROR
含义:另一个侦听器已经获取了这个频道。通知未发送,原始收听者将不再收到通知。
HRESULT: CHANNEL_ACQUIRED
严重: ERROR
含义:由于频道在此通话之前关闭,因此无法发送通知。
HRESULT: CHANNEL_NOT_OPENED
严重: ERROR
含义:无法发送通知,因为该通话前没有打开通道。
HRESULT: CHANNEL_WAITING_FOR_CLIENT_NOTIFICATIO
严重: ERROR
含义:由于尚未收到上次通知的回覆,因此无法发送通知。
HRESULT: INVALID_NOTIFICATION_TYPE
严重: ERROR
含义:指定的通知类型无效。
HRESULT: MAX_NOTIFICATION_SIZE_EXCEEDED
严重: ERROR
含义:已超过通知数据的最大大小。默认情况下,允许的最大数据大小为10兆字节。
HRESULT: NO_LISTENERS
严重: SUCCESS
含义:表示没有注册的聆听应用程序。
HRESULT: UNIRECTIONAL_NOTIFICATION_LOST
严重: SUCCESS
含义:一个或多个听众没有收到此通知;至少有一个听众收到此通知。
返回值是COM错误代码。因为此函数可能会成功完成操作,而是返回除S_OK之外的HRESULT,则应使用SUCCEEDED或FAILED宏来确定调用的成功。要获取函数返回的具体HRESULT,请使用HRESULT_CODE宏。以下代码示例显示了如何使用这些宏。
C++
if (SUCCEEDED(hr)){
//call was successful
}
if (FAILED(hr)) {
// call failed
}
if (FAILED(hr)) {
// call failed
switch (HRESULT_CODE(hr)){
case CHANNEL_CLOSED_BY_ANOTHER_LISTENER:
// some action
break;
case CHANNEL_CLOSED_BY_SAME_LISTENER:
// some action
break;
default:
//default action
break;
}
} else {
//call succeeded
}
PowerBASIC++
IF SUCCEEDED(hr) THEN
' // call was successful
END IF
IF FAILED(hr) THEN
' // call failed
END IF
IF FAILED(hr) THEN
' // call failed
SELECT CASE HRESULT_CODE(hr)
CASE %CHANNEL_CLOSED_BY_ANOTHER_LISTENER
' // some action
CASE %CHANNEL_CLOSED_BY_SAME_LISTENER
' // some action
CASE ELSE
' // default action
END SELECT
ELSE
' // call succeeded
END IF
有关其他可能的返回值,请参阅PrintAsyncNotifyError.
备注
对于单向通道,如果在打印后台打印程序处理早期的SendNotification调用时发出SendNotification调用,则打印后台处理程序将对通知进行排队。如果Print Spooler托管的组件或应用程序调用{??989796255},排队通知将被丢弃。
对于双向通道,如果在打印假脱机程序处理较早的呼叫SendNotification??时进行SendNotification呼叫,则呼叫将失败。在这种情况下,如果来电者是Print Spooler中的发件人,则SendNotification将返回CHANNEL_WAITING_FOR_CLIENT_NOTIFICATION。如果呼叫者是发送回复的侦听器,则SendNotification返回ASYNC_CALL_IN_PROGRESS。
当同一个双向通道存在多个侦听器时,通道上发送的初始通知将传递给所有侦听器。第一个回覆的听众将收到该频道。频道获取后呼叫SendNotification的听众将失败,错误CHANNEL_ACQUIRED。
在双向频道上接收到初始通知的听众可能不会对获取频道感兴趣。在这种情况下,可以调用IUnknown.Release方法。如果SendNotification或IPrintAsyncNotifyChannel.CloseChannel方法被调用,则不需要调用IUnknown.Release方法。


