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


Ограничения JavaScript

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Модель драйвера принтера версии 4 поддерживает новую модель для расширенного ограничения и обработки PrintTicket, которая является производным от интерфейса IPrintOemPrintTicketProvider .

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

Ограничения JavaScript можно использовать для расширения PrintCapabilities, проверки PrintTickets и обработки преобразования PrintTicket в DEVMODE и наоборот. Однако ограничения JavaScript имеют несколько ограничений. Ниже приведен список основных ограничений.

  • Функции и параметры, добавленные с помощью CompletePrintCapabilities, а также ограничения, указанные в validatePrintTicket, не отображаются в окне параметров принтера рабочего стола.

  • Функции и параметры, добавленные при использовании CompletePrintCapabilities, не сохраняются в общедоступной версии DEVMODE.

  • Ограничения JavaScript не могут получить доступ к языковым ресурсам из библиотек dll ресурсов для локализации добавленных компонентов и параметров.

Поэтому рекомендуется использовать ограничения JavaScript только в случае необходимости. Функции и параметры должны быть указаны в файлах GPD или PPD, где это возможно, и в JavaScript должны быть представлены только сложные ограничения.

Отладка файлов JavaScript

Базовая синтаксическая проверка файлов JavaScript поддерживается путем открытия файла JavaScript в узле скриптов windows. Для этого щелкните правой кнопкой мыши файл JavaScript и выберите команду "Открыть с помощью" и выберите запись узла скриптов Windows в списке. Если ошибки не возникают, JavaScript является синтаксически допустимым. В противном случае будет указан номер строки проблемы, как показано на следующем снимке экрана.

Диалоговое окно ошибки синтаксиса javascript.

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

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

Имя ключа: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Имя значения: EnableJavaScriptDebugging

Тип: DWORD

Значение: 1

Однако так как PrintConfig.dll загружается и выгружается часто, отладка приложения, которое печатается, не является рекомендуемой стратегией тестирования и отладки. Вместо этого корпорация Майкрософт рекомендует производителям создавать тестовое приложение, которое вызывает каждую из соответствующих точек входа для ограничений JavaScript с помощью этих общедоступных API: PTGetPrintCapabilities, PTConvertDevModeToPrintTicket, PTConvertPrintTicketToDevMode и PTMergeAndValidatePrintTicket.

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

Пошаговое руководство по модульного тестирования с помощью командного теста Visual Studio

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

Важно отметить, что если исходный файл не удается проанализировать, отладчик не вызывается, и он будет выглядеть так, как если среда отладки завершилась ошибкой. Если исходный файл не удается проанализировать, дополнительные сведения о том, как продолжить, см. в разделе "Узел скриптов Windows".

Если ошибки отсутствуют, и исходный файл успешно анализируется, отладите исходный файл следующим образом:

  1. Установка Microsoft Visual Studio 2012 или более поздней версии на тестовом компьютере

  2. Создание очереди печати с помощью драйвера с ограничениями кода JavaScript

  3. Задайте эту очередь печати в качестве очереди печати по умолчанию.

  4. Запустите тестовое приложение или приложение, которое печатает и начинает сценарий, который приведет к вызову ограничений JavaScript. Приложение должно вызывать API PrintTicket/PrintCapabilities, чтобы перейти к ограничениям JavaScript; старые приложения, такие как Блокнот, не вызываются в эти API, но приложение средства просмотра XPS делает. Корпорация Майкрософт рекомендует использовать тестовое приложение здесь, так как сценарии могут быть проще изолированы и воспроизведены.

  5. В настоящее время отладчик Visual Studio just-in-Time появится сообщение "Необработанное исключение произошло в <приложении>"

  6. Запуск нового экземпляра Visual Studio 2012 или более поздней версии

  7. Выберите "Отладка", а затем подключитесь к процессу

  8. В диалоговом окне "Присоединение к процессу" убедитесь, что для присоединения к следующему параметру задано значение "Код скрипта"

  9. Теперь выберите тестовое приложение или печать приложения и, наконец, нажмите кнопку "Присоединить"

  10. Нажмите кнопку "Разорвать все"

  11. Теперь вернитесь в диалоговое окно "JIT-отладчик Visual Studio" и нажмите кнопку "Нет"

  12. Visual Studio разорвит отладчик в расположении, которое вызывается текущим тестом. Теперь код можно отлаживать обычно.

API ограничений JavaScript

В этом разделе указаны функции, которые служат точками входа API для использования в файле ограничений JavaScript. Это функции:

  • validatePrintTicket

  • completePrintCapabilities

  • convertDevModeToPrintTicket

  • convertPrintTicketToDevMode

Функция validatePrintTicket

Этот API вызывается для проверки допустимости объекта PrintTicket для определенного принтера. Это аналогично функции API IPrintOemPrintTicketProvider::ValidatePrintTicket.

Синтаксис validatePrintTicket

function validatePrintTicket(printTicket, scriptContext)

Параметры validatePrintTicket

  • printTicket

    [in] [out] Проверяемый объект IPrintSchemaTicket .

  • scriptContext

    [in] Объект IPrinterScriptContext , предоставляющий доступ к контейнеру свойств драйвера, контейнеру свойств очереди и контейнеру свойств пользователя.

значение возвращаемого значения validatePrintTicket

Возвращаемое значение Description
0 Указывает, что параметр printTicket недопустим и не удалось исправить. Эквивалент E_PRINTTICKET_FORMAT.
1 Указывает, что параметр printTicket является допустимым printTicket для этого принтера. Эквивалент S_PT_NO_CONFLICT.
2 Указывает, что параметр printTicket был изменен, чтобы сделать его допустимым. Эквивалент S_PT_CONFLICT_RESOLVED.

функция completePrintCapabilities

Этот API вызывается для разрешения изменения объекта PrintCapabilities. Это следует использовать для условных функций (например, без границ поддерживается только на фотобумаже) или для представления функций, которые не могут быть созданы GPD или PPD-файлом (например, вложенными определениями признаков). Это аналогично функции API IPrintOemPrintTicketProvider::CompletePrintCapabilities.

Синтаксис completePrintCapabilities

function completePrintCapabilities(printTicket, scriptContext, printCapabilities)

Параметры completePrintCapabilities

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

Нет.

Функция convertDevModeToPrintTicket

Этот API вызывается для преобразования значений из контейнера свойств DEVMODE в PrintTicket. Это аналогично функции в API IPrintOemPrintTicketProvider::ConvertDevModeToPrintTicket, за исключением того, что эта реализация инкапсулирует частный раздел DEVMODE в объект IPrinterScriptablePropertyBag и не разрешает доступ к общедоступному разделу DEVMODE.

Синтаксис convertDevModeToPrintTicket

function convertDevModeToPrintTicket(devModeProperties, scriptContext, printTicket)

convertDevModeToPrintTicket parameters

  • devModeProperties

[in] Объект IPrinterScriptablePropertyBag , представляющий контейнер свойств DEVMODE.

значение возвращаемого значения convertDevModeToPrintTicket

Нет.

Функция convertPrintTicketToDevMode

Этот API вызывается для преобразования значений из PrintTicket в контейнер свойств DEVMODE. Это аналогично функции API IPrintOemPrintTicketProvider::ConvertPrintTicketToDevMode , за исключением того, что эта реализация инкапсулирует частный раздел DEVMODE в объект IPrinterScriptablePropertyBag и не разрешает доступ к общедоступному разделу DEVMODE.

Синтаксис convertPrintTicketToDevMode

function convertPrintTicketToDevMode(printTicket, scriptContext, devModeProperties)

параметры convertPrintTicketToDevMode

  • printTicket

    [in] Объект IPrintSchemaTicket, представляющий преобразованный PrintTicket .

  • scriptContext

    [in] Объект IPrinterScriptContext , предоставляющий доступ к контейнеру свойств драйвера, контейнеру свойств очереди и контейнеру свойств пользователя.

  • devModeProperties

    [in] [out] Объект IPrinterScriptablePropertyBag , представляющий контейнер свойств DEVMODE.

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

Нет.

Рекомендации по ограничению

Диалоговое окно печати Windows 8 и параметры печати поддерживают только подмножество пространства имен "Ключевые слова схемы печати". В результате корпорация Майкрософт не рекомендует использовать ограничения между функциями, которые поддерживаются в диалоговом окне печати Windows 8 или пользовательском интерфейсе и функциях печати, которые не находятся в этом пользовательском интерфейсе, так как пользователи не смогут устранить такие ограничения.

Например, если параметр PageMediaType с именем Photo ограничен только для работы со значением PageResolution 1200dpi, пользователи никогда не смогут выбрать тип носителя Photo. В таких случаях лучше соответствовать намерению пользователя (фото-носителю) и настраивать все параметры, необходимые для этого. Эти корректировки можно внести в код ограничения JavaScript.

Если драйвер не использует ограничения JavaScript, нет необходимости предоставлять файл. Если драйвер использует ограничения JavaScript только для подмножества точек входа (например, validatePrintTicket), другие точки входа должны быть полностью опущены из файла JavaScript.