Выбор пользовательского режима или режима ядра
Важно!
Мы рекомендуем использовать драйвер класса "Входящие" корпорации Майкрософт, а также приложения для поддержки печати (PSA) корпорации Майкрософт, чтобы настроить возможности печати в Windows 10 и 11 для разработки принтеров.
Дополнительные сведения см. в руководстве по проектированию приложений поддержки печати.
Выполнение библиотек DLL графики принтера в пользовательском режиме обеспечивает следующие преимущества по сравнению с выполнением в режиме ядра:
Неограниченное пространство стека.
Доступ к API Win32.
Меньше возможностей для возникновения сбоев системы.
Упрощенная отладка с помощью отладчиков в пользовательском режиме.
Улучшенные возможности с плавающей запятой, так как использование графических функций DDI с плавающей запятой не требуется.
Возможность вызова любых пользовательских библиотек DLL, предоставляемых поставщиком, которые не являются частью описанной архитектуры драйвера принтера Microsoft Windows 2000 и более поздних версий.
В Windows Vista невозможно установить драйвер принтера в режиме ядра. Если приложение попытается сделать это, функции AddPrinterDriver и AddprinterDriverEx (описанные в документации по Windows SDK) завершатся сбоем с кодом ошибки ERROR_KM_DRIVER_BLOCKED.
В следующей таблице показаны разрешенные режимы выполнения драйвера принтера.
Версия операционной системы | Разрешенный режим выполнения библиотеки DLL графики принтера |
---|---|
Windows NT 4.0 | ядро |
Windows 2000 | пользователь или ядро |
Windows XP и Server 2003 | режим ядра, доступный для существующих принтеров; пользовательский режим, необходимый для установки новых принтеров |
Windows Vista | пользователь |
Использование графического DDI в пользовательском режиме
Библиотека DLL графики принтера в пользовательском режиме не ограничивается вызовом служб поддержки GDI и других функций обратного вызова DDI графики с префиксом Eng. Однако существуют некоторые правила, которые необходимо соблюдать.
Как и графические библиотеки DLL в режиме ядра, графические библиотеки DLL пользовательского режима должны вызывать графические DIS, которые создают или изменяют поверхность рисования. Эти функции обратного вызова являются службами поддержки GDI, и вызов эквивалентов Win32 этих функций рисования не допускается.
Для библиотек DLL в пользовательском режиме вызовы этих функций обратного вызова рисования перехватываются клиентом GDI пользовательского режима, который затем передает вызовы обработчику графической отрисовки (GRE) режима ядра GDI.
Следующий список графических функций DDI с префиксом Eng не могут вызываться библиотеками DLL пользовательского режима:
Библиотеки DLL графики принтера в пользовательском режиме могут по-прежнему использовать графические функции DDI для служб GDI с плавающей запятой.
Преобразование существующей библиотеки DLL графики принтера в пользовательский режим
Если вы ранее разработали библиотеку DLL графики принтера, которая выполняется в режиме ядра, можно преобразовать библиотеку DLL в режим выполнения в пользовательском режиме. Чтобы выполнить преобразование, добавьте функцию DrvQueryDriverInfo в библиотеку DLL, а затем следуйте правилам создания библиотеки DLL графики принтера.
Создание библиотеки DLL для графики принтера в пользовательском режиме
Для разработки новой библиотеки DLL для печати, которая выполняется в пользовательском режиме, можно продолжать использовать все графические функции DDI, используемые библиотеками DLL в режиме ядра. Однако у вас также есть следующие варианты:
Для функций с префиксом Eng, имеющих точные эквиваленты Win32, рекомендуется вызывать функции Win32. В следующей таблице перечислены эти функции с префиксом Eng, а также их эквиваленты Win32.
Функция с префиксом Eng Эквивалент Win32 EngAllocMem HeapAlloc EngAllocUserMem HeapAlloc EngEnumForms EnumForms EngFreeMem HeapFree EngFreeUserMem HeapFree EngFindImageProcAddress GetProcAddress EngGetForm GetForm EngGetLastError GetLastError EngGetPrinter GetPrinter EngGetPrinterData GetPrinterData EngGetPrinterDriver GetPrinterDriver EngLoadImage LoadLibrary EngMulDiv МалДив EngSetLastError SetLastError EngSetPrinterData SetPrinterData EngUnloadImage FreeLibrary EngWritePrinter WritePrinter Для функций с префиксом Eng, которые соответствуют функциям Win32 с аналогичными функциями, также рекомендуется вызывать функции Win32. В следующей таблице перечислены некоторые из этих функций с префиксом Eng вместе с их аналогами Win32.
Функция с префиксом Eng Эквивалент Win32 EngAcquireSemaphore EnterCriticalSection 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 Floating-Point можно использовать тип данных FLOAT.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по