勇芳软件工作室.汉化:  Printing > Print Spooler API > Asynchronous Printing Notification > Asynchronous Printing Notification Interfaces > IPrintAsyncNotifyChannel >

SendNotification Method

Previous pageReturn to chapter overviewNext page

描述

 

从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方法。如果SendNotificationIPrintAsyncNotifyChannel.CloseChannel方法被调用,则不需要调用IUnknown.Release方法。