Подключаемые модули отрисовки, отличные от COM
Внимание
Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.
Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.
Мини-driver принтера уведомляет основной драйвер своих возможностей, реализуя функцию OEMEnableDriver, которая заполняет члены структуры DRVENABLEDATA. Элемент pdrvfn этой структуры должен быть задан с адресом массива структур DRVFN. Каждый элемент этого массива должен быть инициализирован с индексом функции и адресом одной из функций OEMXxx , которые реализует IHV соответственно. (Подробные описания каждого из них Функции OEMXxx см. в разделе функций, отличных от COM,DDI Hook-Out.)
Когда приложение вызывает Microsoft Win32 GDI для выполнения задачи отрисовки, GDI Win32 в свою очередь вызывается в основной драйвер Unidrv или Pscript5, который обычно обрабатывает задачу. Однако, если мини-накопитель принтера указал, что он может перехватывать определенную операцию отрисовки, основной драйвер передает задачу отрисовки в подключаемый модуль отрисовки IHV.
Например, рассмотрим приложение, которое вызывает API Win32 LineTo (описано в документации по пакету SDK для Windows). Как правило, это приведет к другому вызову DDI основного драйвера DrvLineTo для рисования линии. Если мини-driver принтера указал, что он намерен перехватывать вызовы к этому DDI, однако DrvLineTo немедленно перенаправит вызов функции OEMLineTo IHV.
IHV может реализовать OEMLineTo или любые другие функции перехватчика, описанные в функциях DDI, отличных от COM, чтобы он полностью обрабатывал операцию отрисовки, или он может вернуться к работе с основным драйвером.
OEMLineTo можно реализовать, как показано в следующем примере псевдокода:
BOOL APIENTRY
OEMLineTo(
SURFOBJ *pso,
CLIPOBJ *pco,
BRUSHOBJ *pbo,
LONG x1,
LONG y1,
LONG x2,
LONG y2,
RECTL *prclBounds,
MIX mix
)
{
if ( OEM intends to handle the call ) {
code to handle the call
}
else
// OEM calls Unidrv's DrvLineTo DDI
bRetVal = (((PFN_DrvLineTo)(poempdev->pfnUnidrv[UD_DrvLineTo])) (
pso,
pco,
pbo,
x1,
x2,
y1,
y2,
prclBounds,
mix,));
}
В предыдущем примере выражение
poempdev->pfnUnidrv[UD_DrvLineTo]
вычисляет адрес DDI ядра драйвера DrvLineTo . Выражение (PFN_DrvLineTo), предшествующее ему, приводит указатель функции к соответствующему типу. Каждая из функций перехватчика, перечисленных в этом разделе, связана с собственным указателем функции.
Обратите внимание, что когда OEMXxx DDI возвращается к основному драйверу Unidrv и поверхности, связанной с устройством, Unidrv может просто игнорировать вызов, возвращая значение FALSE.