Поделиться через


Структура MONITOR (winsplp.h)

Внимание!

Структура MONITOR устарела и поддерживается только для обеспечения совместимости. Новые мониторы печати должны реализовывать MONITOR2 , чтобы их можно было использовать с кластерами серверов печати.

Структура MONITOR содержит указатели на функции, определенные мониторами печати.

Синтаксис

typedef struct _MONITOR {
  BOOL( )(LPWSTR pName,DWORD Level,LPBYTE pPorts,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned)  *pfnEnumPorts;
  BOOL( )(LPWSTR pName,PHANDLE pHandle)  *pfnOpenPort;
  BOOL()(LPWSTR pPortName,LPWSTR pPrinterName,PHANDLE pHandle,_MONITOR *pMonitor)  * pfnOpenPortEx;
  BOOL( )(HANDLE hPort,LPWSTR pPrinterName,DWORD JobId,DWORD Level,LPBYTE pDocInfo)  *pfnStartDocPort;
  BOOL( )(HANDLE hPort,LPBYTE pBuffer,DWORD cbBuf,LPDWORD pcbWritten)  *pfnWritePort;
  BOOL( )(HANDLE hPort,LPBYTE pBuffer,DWORD cbBuffer,LPDWORD pcbRead)  *pfnReadPort;
  BOOL( )(HANDLE hPort)  *pfnEndDocPort;
  BOOL( )(HANDLE hPort)  *pfnClosePort;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pMonitorName)  *pfnAddPort;
  BOOL( )(LPWSTR pName,DWORD Level,LPBYTE lpBuffer,LPWSTR lpMonitorName)  *pfnAddPortEx;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pPortName)  *pfnConfigurePort;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pPortName)  *pfnDeletePort;
  BOOL( )(HANDLE hPort,DWORD ControlID,LPWSTR pValueName,LPWSTR lpInBuffer,DWORD cbInBuffer,LPWSTR lpOutBuffer,DWORD cbOutBuffer,LPDWORD lpcbReturned)  *pfnGetPrinterDataFromPort;
  BOOL( )(HANDLE hPort,LPCOMMTIMEOUTS lpCTO,DWORD reserved)  *pfnSetPortTimeOuts;
  BOOL( )(LPCWSTR pszObject,ACCESS_MASK GrantedAccess,PHANDLE phXcv)  *pfnXcvOpenPort;
  DWORD( )(HANDLE hXcv,LPCWSTR pszDataName,PBYTE pInputData,DWORD cbInputData,PBYTE pOutputData,DWORD cbOutputData,PDWORD pcbOutputNeeded) *pfnXcvDataPort;
  BOOL( )(HANDLE hXcv)  *pfnXcvClosePort;
} MONITOR, *LPMONITOR;

Члены

pfnEnumPorts

Функция EnumPorts сервера мониторинга портов в библиотеке DLL перечисляет порты, поддерживаемые монитором портов.

pfnOpenPort

Указатель на функцию OpenPort монитора печати.

pfnOpenPortEx

Функция языкового монитора OpenPortEx открывает порт принтера.

pfnStartDocPort

Функция монитора StartDocPort печати выполняет задачи, необходимые для запуска задания печати на указанном порту.

pfnWritePort

Указатель на функцию WritePort монитора печати.

pfnReadPort

Указатель на функцию ReadPort монитора печати.

pfnEndDocPort

Функция EndDocPort монитора печати выполняет задачи, необходимые для завершения задания печати на указанном порту.

pfnClosePort

Указатель на функцию ClosePort монитора печати.

pfnAddPort

Внимание!

Функция AddPort устарела и не должна использоваться.

AddPort создает порт и добавляет его в список портов, поддерживаемых в настоящее время указанным монитором в среде очереди очереди.

pfnAddPortEx

(Устарело. Должно иметь значение NULL.) Указатель на функцию AddPortEx монитора печати. (Только мониторы портов.)

pfnConfigurePort

Внимание!

Функция ConfigurePort устарела и не должна использоваться. Вместо этого используйте ConfigurePortUI .

ConfigurePort — это функция управления портами, которая настраивает указанный порт.

pfnDeletePort

Внимание!

Функция DeletePort устарела и не должна использоваться.

DeletePort удаляет порт из среды монитора.

pfnGetPrinterDataFromPort

Функция GetPrinterDataFromPort монитора портов получает сведения о состоянии из двунаправленного принтера и возвращает их вызывающему объекту.

pfnSetPortTimeOuts

Функция DLL SetPortTimeOuts сервера мониторинга портов задает значения времени ожидания порта для открытого порта.

pfnXcvOpenPort

Указатель на функцию XcvOpenPort монитора печати. (Только мониторы портов.)

pfnXcvDataPort

Указатель на функцию XcvDataPort монитора печати. (Только мониторы портов.)

pfnXcvClosePort

Указатель на функцию XcvClosePort монитора печати. (Только мониторы портов.)

Комментарии

В следующих разделах каждый член обратного вызова описывается более подробно.

AddPort

typedef BOOL (WINAPI *pfnAddPort)(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pMonitorName
);

Параметры (AddPort)

Monitor [in] (AddPort)

Вызывающий объект предоставил дескриптор экземпляра монитора. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor2 вместо InitializePrintMonitor2.)

pName [in] (AddPort)

Указатель на строку, завершающуюся значением NULL, которая указывает имя сервера, к которому подключен порт. Если pName имеет значение NULL, порт является локальным.

hWnd [in] (AddPort)

Дескриптор родительского окна диалогового окна, в котором будет введено имя порта.

pMonitorName [in] (AddPort)

Указатель на строку, завершающуюся значением NULL, которая указывает монитор, связанный с портом.

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

Возвращаемое значение равно TRUE, если функция выполнена успешно, в противном случае — FALSE.

Настройка порта

typedef BOOL (WINAPI *pfnConfigurePort)(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pPortName
);

Параметры (ConfigurePort)

hMonitor [in] (ConfigurePort)

Вызывающий объект предоставил дескриптор экземпляра монитора. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor вместо InitializePrintMonitor2.)

pName [in] (ConfigurePort)

Указатель на строку, завершающуюся значением NULL, которая указывает имя сервера, на котором существует данный порт. Если эта строка имеет значение NULL, порт является локальным.

hWnd [in] (ConfigurePort)

Дескриптор родительского окна диалогового окна, в котором будут введены сведения о конфигурации.

pPortName [in] (ConfigurePort)

Указатель на строку, завершающуюся значением NULL, которая указывает имя настраиваемого порта.

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

Возвращаемое значение равно TRUE, если функция выполнена успешно.

DeletePort

pfnDeletePort DeletePort;

BOOL WINAPI DeletePort(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pPortName
)

Параметры (DeletePort)

hMonitor [in] (DeletePort)

Вызывающий объект предоставил дескриптор экземпляра монитора. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor вместо InitializePrintMonitor2.)

pName [in] (DeletePort)

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

hWnd [in] (DeletePort)

Дескриптор в родительское окно диалогового окна удаления порта.

pPortName [in] (DeletePort)

Указатель на строку, завершающуюся нулевым значением, которая называет удаляемые порты.

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

Возвращаемое значение равно TRUE, если функция выполнена успешно.

EndDocPort

typedef BOOL ( WINAPI *pfnEndDocPort)(
  _In_ HANDLE hPort
);

Параметры (EndDocPort)

hPort [in] (EndDocPort)

Дескриптор порта, предоставленный вызывающим абонентом.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

EnumPorts

typedef BOOL (WINAPI *pfnEnumPorts)(
  _In_     HANDLE  hMonitor,
  _In_opt_ LPWSTR  pName,
  _In_     DWORD   Level,
  _Out_    LPBYTE  pPorts,
  _In_     DWORD   cbBuf,
  _Out_    LPDWORD pcbNeeded,
  _Out_    LPDWORD pcReturned
);

Параметры (EnumPorts)

hMonitor [in] (EnumPorts)

Вызывающий объект предоставил дескриптор экземпляра монитора. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor вместо InitializePrintMonitor2.)

pName [in, необязательный] (EnumPorts)

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

Level [in] (EnumPorts)

Предоставленное вызывающим объектом значение, указывающее тип структур, возвращаемых в буфере, на который указывает pPorts.

Возможные значения: 1 (PORT_INFO_1) или 2 (PORT_INFO_2).

pPorts [out] (EnumPorts)

Предоставленный вызывающим объектом указатель на буфер для получения сведений о портах. Возвращаемые сведения должны состоять из массива PORT_INFO_1 или PORT_INFO_2 структур, за которыми следуют строки, на которые указывают члены структуры.

cbBuf [in] (EnumPorts)

Размер буфера, на который указывает pPorts, предоставленный вызывающим объектом ( в байтах).

pcbNeeded [out] (EnumPorts)

Предоставленный вызывающим объектом указатель на расположение для получения размера буфера в байтах, необходимого для хранения всей возвращаемой информации.

pcReturned [out] (EnumPorts)

Предоставленный вызывающим абонентом указатель на расположение для получения числа перечисленных портов.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

GetPrinterDataFromPort

pfnGetPrinterDataFromPort GetPrinterDataFromPort;

BOOL WINAPI GetPrinterDataFromPort(
  _In_  HANDLE  hPort,
  _In_  DWORD   ControlID,
  _In_  LPWSTR  pValueName,
  _In_  LPWSTR  lpInBuffer,
  _In_  DWORD   cbInBuffer,
  _Out_ LPWSTR  lpOutBuffer,
  _In_  DWORD   cbOutBuffer,
  _Out_ LPDWORD lpcbReturned
)

Параметры (GetPrinterDataFromPort)

hPort [in] (GetPrinterDataFromPort)

Дескриптор порта, предоставленный вызывающим абонентом.

ControlID [in] (GetPrinterDataFromPort)

Код управления вводом-выводом устройства, предоставленный вызывающим абонентом. Значение, равное нулю, указывает, что имя значения предоставлено pValueName.

pValueName [in] (GetPrinterDataFromPort)

Предоставленный вызывающим абонентом указатель на строку, определяющую запрашиваемую информацию. Допустимо, только если ControlID равен нулю.

lpInBuffer [in] (GetPrinterDataFromPort)

Предоставленный вызывающим объектом указатель на буфер, содержащий входные данные. Используется только в том случае, если controlID не равно нулю.

cbInBuffer [in] (GetPrinterDataFromPort)

Предоставленный вызывающим объектом размер буфера в байтах, на который указывает lpInBuffer.

lpOutBuffer [out] (GetPrinterDataFromPort)

Предоставленный вызывающим объектом указатель на буфер для получения запрошенных данных.

cbOutBuffer [in] (GetPrinterDataFromPort)

Предоставленный вызывающим объектом размер буфера в байтах, на который указывает lpOutBuffer.

lpcbReturned [out] (GetPrinterDataFromPort)

Предоставленный вызывающим объектом указатель на расположение для получения количества байтов, записанных в буфер, на который указывает lpOutBuffer.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

OpenPortEx

pfnOpenPortEx OpenPortEx;

BOOL WINAPI OpenPortEx(
  _In_  HANDLE           hMonitor,
  _In_  HANDLE           hMonitorPort,
  _In_  LPWSTR           pPortName,
  _In_  LPWSTR           pPrinterName,
  _Out_ PHANDLE          pHandle,
  _In_  struct _MONITOR2 *pMonitor
)

Параметры (OpenPortEx)

hMonitor [in] (OpenPortEx)

Вызывающий объект предоставил дескриптор экземпляра языкового монитора. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor вместо InitializePrintMonitor2.) В среде кластера может быть несколько экземпляров языковых мониторов.

hMonitorPort [in] (OpenPortEx)

Вызывающий объект предоставил дескриптор экземпляра монитора порта. Это дескриптор, возвращаемый функцией InitializePrintMonitor2 монитора. (Этот параметр не существует, если монитор печати поддерживает InitializePrintMonitor вместо InitializePrintMonitor2.) Языковой монитор должен использовать этот дескриптор при вызове функций в структуре MONITOR2 порта.

pPortName [in] (OpenPortEx)

Предоставленный вызывающим элементом указатель на строку, содержащую имя порта, который необходимо открыть.

pPrinterName [in] (OpenPortEx)

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

pHandle [out] (OpenPortEx)

Предоставленный вызывающим абонентом указатель на расположение для получения дескриптора порта.

pMonitor [in] (OpenPortEx)

Предоставленный вызывающим элементом указатель на структуру MONITOR2 , возвращаемую функцией InitializePrintMonitor2 монитора портов.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

SetPortTimeOuts

BOOL (WINAPI *pfnSetPortTimeOuts)
    (
    _In_ HANDLE  hPort,
    _In_ LPCOMMTIMEOUTS lpCTO,
    _In_ DWORD   reserved    // must be set to 0
    );

Параметры (SetPortTimeOuts)

hPort [in] (SetPortTimeOuts)

Дескриптор, предоставленный вызывающим для открытого порта, для которого необходимо задать значения времени ожидания.

lpCTO [in] (SetPortTimeOuts)

Указатель на структуру COMMTIMEOUTS , предоставленный вызывающим абонентом.

reserved [in] (SetPortTimeOuts)

Зарезервировано для последующего использования. Необходимо задать нулевое значение.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

StartDocPort

typedef BOOL (WINAPI *pfnStartDocPort)(
  _In_ HANDLE hPort,
  _In_ LPWSTR pPrinterName,
  _In_ DWORD  JobId,
  _In_ DWORD  Level,
  _In_ LPBYTE pDocInfo
);

Параметры (StartDocPort)

hPort [in] (StartDocPort)

Дескриптор порта, предоставленный вызывающим абонентом.

pPrinterName [in] (StartDocPort)

Предоставленный вызывающим абонентом указатель на строку, содержащую имя принтера.

JobId [in] (StartDocPort)

Предоставленный вызывающим, идентификатор задания, назначаемый диспетчером очереди.

Level [in] (StartDocPort)

Предоставленное вызывающим абонентом значение, указывающее тип структуры, на которую указывает pDocInfo.

Возможные значения: 1 (DOC_INFO_1) или 2 (DOC_INFO_2).

pDocInfo [in] (StartDocPort)

Указатель на структуру DOC_INFO_1 или DOC_INFO_2 , предоставленный вызывающим абонентом.

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

Если операция выполнена успешно, функция должна вернуть значение TRUE. В противном случае он должен вернуть значение FALSE.

Примечания

Диспетчер очереди очереди вызывает AddPort , когда получает запрос приложения на добавление порта в среду. Диспетчер очереди очереди перенаправит вызов в монитор именованных портов на именованном сервере.

AddPort позволяет добавлять порт в интерактивном режиме. Монитор должен предложить пользователю ввести имя порта в диалоговом окне, связанном с hWnd. AddPort должен проверить введенное имя порта, вызвав функцию Win32 EnumPorts, чтобы убедиться, что в среду очереди не добавляются повторяющиеся имена портов. Монитор также должен убедиться, что порт поддерживается.

Диспетчер очереди не поддерживает удаленные вызовы AddPort . Следовательно, реализации AddPort могут игнорировать параметры pName и pMonitorName .

Диспетчер очереди очереди вызывает ConfigurePort , чтобы монитор портов смог выполнить настройку портов. ConfigurePort может предложить диалоговое окно для получения от пользователя некоторых или всех необходимых сведений о конфигурации портов.

Диспетчер очереди очереди не поддерживает удаленные вызовы ConfigurePort ; Следовательно, мониторы могут игнорировать параметр pName .

Диспетчер очереди очереди вызывает DeletePort, чтобы монитор портов смог удалить порт из среды монитора. Монитор должен удалить указанный порт из своего состояния. Диспетчер очереди не будет вызывать DeletePort на мониторе, пока открыт порт.

Приложения могут удалять локальные и удаленные порты. В пользовательском интерфейсе принтера отображается окно подтверждения, прежде чем модуль очереди очереди будет вызывать DeletePort, поэтому монитор должен игнорировать параметр hWnd и не отображать другое диалоговое окно.

Языковые мониторы и библиотеки DLL сервера мониторинга портов необходимы для определения функции EndDocPort и включения адреса функции в структуру MONITOR2 .

Дескриптор, полученный в качестве аргумента hPort функции, является дескриптором порта, предоставленным функцией OpenPort или OpenPortEx монитора.

Функция EndDocPort языкового монитора обычно вызывает функцию EndDocPort связанного монитора портов. Он также должен уведомить диспетчер очереди печати, когда устройство печати завершило задание, вызвав SetJob, указав команду JOB_CONTROL_LAST_PAGE_EJECTED. Языковые мониторы для двунаправленных принтеров не должны вызывать SetJob , пока принтер не отправит уведомление о том, что задание действительно завершено.

Функция EndDocPort сервера мониторинга портов dll обычно вызывает функцию CloseHandle , чтобы закрыть дескриптор, полученный ранее путем вызова CreateFile из startDocPort. Он также должен уведомить диспетчер очереди печати, когда устройство печати завершило задание, вызвав SetJob, указав команду JOB_CONTROL_SENT_TO_PRINTER. (Если диспетчер очереди печати взаимодействует с портом через языковой монитор, задание не считается завершенным, пока языковой монитор не отправит JOB_CONTROL_LAST_PAGE_EJECTED.)

Функция EndDocPort должна освободить все ресурсы, выделенные функцией StartDocPort .

Вы можете изменить поведение функции EndDocPort , если пользователь удалил или перезапустил задание печати. Функция может вызывать GetJob и проверка состояние JOB_STATUS_DELETING или JOB_STATUS_RESTART, чтобы узнать, произошло ли одно из этих событий.

Библиотеки DLL сервера мониторинга портов необходимы для определения функции EnumPorts и включения адреса функции в структуру MONITOR2 . Языковые мониторы не экспортируют эту функцию.

Функция EnumPorts предназначена для перечисления портов, поддерживаемых монитором печати. Это порты, которые ранее были указаны для функции AddPortUI или AddPortEx монитора.

Функция EnumPorts должна заполнить буфер, на который указывает pPort , массивом PORT_INFO_1 или PORT_INFO_2 структур. Затем, начиная с расположения памяти после последнего элемента массива, функция должна загрузить все строки, на которые указывают члены структуры массива. Пример того, как это сделать, см. в localmon.dll ( пример монитора портов). Функция также должна возвращать количество предоставленных структур (т. е. количество поддерживаемых портов), поместив это число в расположение, на которое указывает pcReturned.

Вызывающий объект задает размер предоставленного буфера в cbBuf. Если буфер слишком мал, функция должна поместить требуемый размер буфера в расположение, указанное pcbNeeded, вызвать Метод SetLastError , указав ERROR_INSUFFICIENT_BUFFER, и вернуть значение FALSE.

Если Level содержит недопустимый номер уровня, функция должна вызвать SetLastError , указав ERROR_INVALID_LEVEL, и вернуть значение FALSE. Некоторые мониторы портов поддерживают только значение уровня 1.

Монитор портов должен поддерживать локализацию строк, на которые указывают элементы pMonitorName и pDescription структуры PORT_INFO_2. Эти строки должны быть определены в файлах ресурсов и получены путем вызова LoadString.

Элемент fPortType структуры PORT_INFO_2 не используется с операционными системами на основе NT.

Библиотеки DLL сервера языковых мониторов и мониторов портов могут при необходимости определить функцию GetPrinterDataFromPort и включить адрес функции в структуру MONITOR2 .

Функция предназначена для использования с двунаправленными принтерами и может использоваться двумя способами:

  • В качестве средства запроса языкового монитора для опроса порта принтера, чтобы получить текущее значение сведений о принтере, хранящихся в реестре.

  • Как средство запроса монитора порта для отправки кода управления вводом-выводом в драйвер порта.

Если функция GetPrinterDataFromPort языкового монитора получает указатель строки в pValueName, она должна вернуть значение в предоставленном выходном буфере. Как правило, строка представляет имя значения реестра, а диспетчер очереди очереди вызывает GetPrinterDataFromPort , когда приложение вызывает функцию GetPrinterData .

В обязанности языкового монитора входит отправка команды на оборудование принтера путем вызова функции WritePort монитора портов и считывания ответа путем вызова ReadPort, чтобы получить необходимое значение. Например, pjlmon.dll, пример языкового монитора, может возвращать значения для имен реестра "Установленная память" и "Доступная память".

После того как очередь очереди вызывает GetPrinterDataFromPort для получения значения реестра, он обновляет реестр новым значением.

Как правило, мониторы портов не поддерживают вызовы GetPrinterDataFromPort , которые содержат строковый указатель в pValueName.

Если функция GetPrinterDataFromPort языкового монитора получает ненулевой код элемента управления ввода-вывода в ControlID, она должна просто вызвать функцию GetPrinterDataFromPort связанного монитора портов и вернуть результат. В справочнике по драйверам режима ядра перечислены коды элементов управления вводом-выводом для параллельных и последовательных портов.

Когда функция GetPrinterDataFromPort монитора портов получает ненулевой код элемента управления ввода-вывода в ControlID, она должна вызвать DeviceIOControl , чтобы передать код управления драйверу порта в режиме ядра. Значения параметров lpInBuffer, cbInBuffer, lpOutBuffer, cbOutBuffer и lpcbReturned также должны передаваться в DeviceIOControl.

Языковые мониторы необходимы для определения OpenPortEx функции и включения ее адреса в структуру MONITOR2 . Функция OpenPortEx вызывается диспетчером очереди печати при подключении очереди печати к порту.

Основная OpenPortEx цель функции — возврат дескриптора порта, который вызывающий объект может использовать в качестве входного аргумента для последующих вызовов функций StartDocPort, WritePort, ReadPort, EndDocPort и GetPrinterDataFromPort языкового монитора . Так как языковой монитор обычно реализует эти функции путем вызова эквивалентных функций в связанном мониторе портов, языковой монитор обычно получает дескриптор порта, вызывая функцию OpenPort монитора портов. Дополнительные сведения см. в разделе Взаимодействие с монитором языков и портов.

Параметр OpenPortExpMonitor функции является указателем на структуру MONITOR2 монитора портов. Эта структура содержит указатели на вызываемые функции монитора портов. Функция OpenPortEx должна проверка структуру, чтобы убедиться, что все необходимые указатели функций не имеют значения NULL. Если структура является допустимой, функция должна скопировать ее в локальное хранилище. В противном случае OpenPortExвызовет SetLastError, указав ERROR_INVALID_PRINT_MONITOR, и возвращает значение FALSE.

Функции монитора печати, принимаюющие дескриптор порта в качестве входных данных, также не принимают дескриптор монитора. OpenPortEx Поэтому функция должна хранить полученный дескриптор монитора в расположении, на которое может ссылаться дескриптор порта. Это позволяет функциям, принимаюющим дескриптор порта, ссылаться на дескриптор монитора.

Функция DLL SetPortTimeOuts сервера мониторинга портов позволяет языковому монитору указывать значения времени ожидания порта для открытого порта. Функция является необязательной и должна предоставляться только в том случае, если монитор портов управляет портом, который позволяет изменять значения времени ожидания порта. Если функция определена, ее адрес должен быть включен в структуру MONITOR2 .

Функция вызывается pjlmon.dll, примером языкового монитора, и вы можете написать настраиваемый языковой монитор, который вызывает ее. Очередь печати печати не вызывает SetPortTimeOuts.

Монитор портов должен инициализировать значения времени ожидания порта из функции OpenPort .

Языковые мониторы и библиотеки DLL сервера мониторинга портов необходимы для определения StartDocPort функции и включения адреса функции в структуру MONITOR2 .

Дескриптор, полученный в качестве аргумента hPort функции, является дескриптором порта, предоставленным функцией OpenPort или OpenPortEx монитора.

Функция языкового монитора StartDocPort обычно вызывает функцию связанного монитора StartDocPort портов.

Функция DLL StartDocPort сервера мониторинга портов обычно вызывает функцию CreateFile , чтобы создать подключение к драйверу порта в режиме ядра.

При необходимости монитор портов должен запретить другим процессам использовать указанный порт до вызова EndDocPort . Например, монитор портов для COM-порта должен убедиться, что во время отправки данных принтера на порт в другое приложение не предполагает, что порт подключен к определенному устройству связи, а затем пытается связаться с этим устройством. Это предупреждающее примечание не применяется к локальному поставщику печати, что гарантирует, что он никогда не вызывает StartDocPort дважды подряд без промежуточного вызова EndDocPort, но применяется к поставщикам печати, которые не дают этой гарантии.

Требования

Требование Значение
Заголовок winsplp.h (включая Winsplp.h)

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

MONITOR2

MONITORUI