Функция 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

Указатель на объект, который прослушивающее приложение будет использовать для обратного вызова компонента, размещенного в очереди очереди печати. Значение должно иметь значение NULL , если направление имеет значение kUniDirectional.

[out] ppIAsynchNotification

Указатель на новый канал.

Возвращаемое значение

HRESULT Severity Значение
S_OK УСПЕШНОЕ ЗАВЕРШЕНИЕ Функция успешно завершена.
CHANNEL_ALREADY_OPENED ОШИБКА Канал уже открыт.
MAX_CHANNEL_COUNT_EXCEEDED ОШИБКА Максимальное число прослушивающих приложений, уже зарегистрированных для указанного типа уведомлений с указанной очередью или сервером печати. Максимальное значение по умолчанию — 10 000.
 

Возвращаемыми значениями являются коды ошибок COM. Так как эта функция может успешно завершить операцию, но вернуть HRESULT , отличный от S_OK для определения успешности вызова следует использовать макрос 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; Однако метод IPrintAsyncNotifyChannel::CloseChannel не может быть вызван сразу после вызова Метода CreatePrintAsyncNotifyChannel.

Вызовите только 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 ИЛИ.
    4. на стороне клиента вы не повторяли вызов IPrintAsyncNotifyChannel::SendNotification, который успешно завершился с возвращаемым значением CHANNEL_ACQUIRED.

Требования

Требование Значение
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header prnasnot.h
Библиотека Winspool.lib
DLL Spoolss.dll

См. также раздел

Олицетворение клиента

Функции API очереди печати принтера

Вывод на печать