Добавление двунаправленного обмена данными

Модуль очереди печати обеспечивает поддержку двунаправленного взаимодействия (BiDi) между приложением или драйвером и принтером. Эта поддержка позволяет приложению или драйверу отправлять один или несколько запросов на принтер, а принтер — отвечать на эти запросы.

схема, иллюстрирующая архитектуру поддержки двунаправленного направления.

Требования к двунаправленному обмену данными

Прежде чем приложение или драйвер смогут использовать обмен данными bidi, оно должно реализовать двунаправленные интерфейсы связи: com-интерфейс IBidiSpl или COM-интерфейс IbidiSpl2 , а также по крайней мере один из com-интерфейсов IBidiRequest и IBidiRequestContainer . Кроме того, должно выполняться одно или оба следующих условия:

  • Функция SendRecvBidiData реализована в библиотеке DLL поставщика печати.

  • Функция SendRecvBidiDataFromPort реализована в библиотеке DLL сервера языкового монитора или в библиотеке DLL сервера мониторинга портов.

Чтобы отправить один запрос принтеру, приложение или драйвер принтера должны сначала создать запрос, а затем вызвать метод IBidiSpl::SendRecv. Чтобы отправить несколько запросов, приложение или драйвер составляет список запросов, а затем вызывает метод IBidiSpl::MultiSendRecv .

После получения запроса клиентская часть очереди очереди (Winspool.drv) передает ее в серверный диспетчер очереди (spoolsv.exe). Диспетчер очереди очереди на стороне сервера может находиться на локальном компьютере или на удаленном сервере печати по сети. Когда серверный диспетчер очереди очереди очереди получает запрос, он анализирует данные в запросе и заполняет элементы структуры BIDI_REQUEST_CONTAINER .

Затем серверный диспетчер очереди очереди вызывает SendRecvBidiData или SendRecvBidiDataFromPort. При возврате любой из функций ее параметр ppResData указывает на расположение памяти, содержащее адрес заполненной структуры BIDI_RESPONSE_CONTAINER , содержащей ответ принтера. Серверный диспетчер очереди преобразует данные в этой структуре в форму, подходящую для использования приложением или драйвером, и передает их обратно в клиентская очередь очереди и, наконец, обратно инициатору запроса.