Выбор пользовательского режима или режима ядра
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.
Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.
Выполнение библиотек DLL графики принтера в пользовательском режиме обеспечивает следующие преимущества при выполнении в режиме ядра:
Неограниченное пространство стека.
Доступ к API Win32.
Меньше возможностей для возникновения сбоев системы.
Упрощенная отладка с помощью отладчиков пользовательского режима.
Улучшены возможности с плавающей запятой, так как использование функций с плавающей запятой DDI графики не требуется.
Возможность вызывать пользовательские библиотеки DLL, предоставляемые поставщиком, которые не являются частью описанной архитектуры драйвера принтера Microsoft Windows 2000 и более поздних версий.
В Windows Vista невозможно установить драйвер принтера в режиме ядра. Если приложение пытается сделать это, функции AddPrinterDriver и AddprinterDriverEx (описанные в документации по пакету SDK для Windows) завершаются ошибкой с кодом ошибки ERROR_KM_DRIVER_BLOCKED.
В следующей таблице показаны режимы выполнения драйвера принтера:
Версия операционной системы | Разрешенный режим выполнения библиотеки DLL графики принтера |
---|---|
Windows NT 4.0 | Backports |
Windows 2000 | пользователь или ядро |
Windows XP и Server 2003 | режим ядра, доступный для существующих принтеров; режим пользователя, необходимый для новых установок принтера |
Windows Vista | Пользователь |
Использование графического DDI в пользовательском режиме
Библиотека DLL графического принтера в пользовательском режиме не ограничивается вызовом служб поддержки GDI и других функций обратного вызова DDI с префиксом Eng. Однако существуют некоторые правила, которые должны соблюдаться:
Как и библиотеки DLL в режиме ядра, библиотеки DLL графики в пользовательском режиме должны вызывать графические DDIs, создающие или изменяющие область рисования. Эти функции обратного вызова являются службами поддержки GDI, и вызовы эквивалентов Win32 этих функций рисования не допускаются.
Для библиотек DLL в пользовательском режиме вызовы этих функций обратного вызова документа перехватываются клиентом GDI пользовательского режима, который затем передает вызовы подсистеме отрисовки в режиме ядра GDI (GRE).
Следующий список функций DDI с префиксом Eng не может вызываться библиотеками DLL в пользовательском режиме:
Библиотеки DLL принтера в режиме пользователя могут продолжать использовать функции DDI графики для служб с плавающей запятой GDI.
Преобразование существующей библиотеки DLL графики принтера в режим пользователя
Если вы ранее разработали библиотеку DLL графики принтера, которая выполняется в режиме ядра, можно преобразовать библиотеку DLL в выполнение в пользовательском режиме. Чтобы преобразовать, добавьте функцию DrvQueryDriverInfo в библиотеку DLL, а затем следуйте правилам для создания библиотеки DLL графики принтера.
Создание библиотеки DLL графики принтера в пользовательском режиме
Чтобы разработать новую библиотеку DLL графики принтера, которая выполняется в пользовательском режиме, можно продолжать использовать все функции DDI графики, используемые библиотеками DLL в режиме ядра. Однако у вас также есть следующие варианты:
Для функций с префиксом Eng, имеющих точные эквиваленты Win32, рекомендуется вызывать функции Win32. В следующей таблице перечислены эти функции с префиксом Eng, а также их эквиваленты Win32.
Функция с префиксом Eng Эквивалент Win32 EngAllocMem КучиAlloc EngAllocUserMem КучиAlloc EngEnumForms EnumForms EngFreeMem HeapFree EngFreeUserMem HeapFree EngFindImageProcAddress Функция GetProcAddress EngGetForm GetForm EngGetLastError GetLastError EngGetPrinter GetPrinter EngGetPrinterData GetPrinterData EngGetPrinterDriver GetPrinterDriver EngLoadImage LoadLibrary EngMulDiv MulDiv EngSetLastError SetLastError EngSetPrinterData SetPrinterData EngUnloadImage FreeLibrary EngWritePrinter WritePrinter Для функций с префиксом Eng, которые соответствуют функциям Win32 с аналогичными функциями, также рекомендуется вызывать функции Win32. В следующей таблице перечислены некоторые из этих функций с префиксом Eng вместе с их коллегами Win32.
Функция с префиксом Eng Эквивалент Win32 EngAcquireSemaphore ВводCriticalSection EngCreateSemaphore Выделите объект CRITICAL_SECTION и инициализировать его с помощью вызова функции Win32 InitializeCriticalSection. EngDeleteSemaphore DeleteCriticalSection EngFindResource FindResource EngFreeModule FreeLibrary EngLoadModule LoadLibrary EngMultiByteToWideChar MultiByteToWideChar EngQueryLocalTime GetLocalTime EngReleaseSemaphore ReleaseSemaphore EngWideCharToMultiByte WideCharToMultiByte Для функций, создающих или изменяющих службу рисования, новые драйверы должны продолжать вызывать службы поддержки GDI, а не эквиваленты Win32.
Вместо использования графических функций DDI для служб С плавающей запятой GDI можно использовать тип данных FLOAT.