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


Подключаемые модули отрисовки, отличные от 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.