Partilhar via


Renderização nãoCOM-Based Plug-Ins

Importante

A moderna plataforma de impressão é o meio preferido do Windows para comunicar com as impressoras. Recomendamos que utilize o controlador de classe da caixa de entrada IPP da Microsoft, juntamente com as Aplicações de Suporte de Impressão (PSA), para personalizar a experiência de impressão no Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte o guia de design do aplicativo de suporte Print.

Um minidriver de impressora notifica o driver principal das suas capacidades implementando a função OEMEnableDriver, que preenche os membros de uma estrutura DRVENABLEDATA. O membro pdrvfn desta estrutura deve ser definido com o endereço da matriz das estruturas DRVFN. Cada elemento dessa matriz deve ser inicializado com um índice de função e o endereço de uma das funções OEMXxx que o IHV está implementando, respectivamente. (Para obter descrições detalhadas de cada uma das funções OEMXxx, consulte as Funções não-COM-Based DDI Hook-Out.)

Quando um aplicativo chama o Microsoft Win32 GDI para executar uma tarefa de renderização, o Win32 GDI, por sua vez, chama o driver principal Unidrv ou Pscript5, que geralmente lida com a tarefa. No entanto, se um minidriver de impressora tiver indicado que é capaz de conectar uma operação de renderização específica, o driver principal passará a tarefa de renderização para o plug-in de renderização IHV.

Por exemplo, considere um aplicativo que faz uma chamada para o Win32 LineTo API (descrito na documentação do SDK do Windows). Geralmente, isso resultaria em outra chamada para o driver principal DrvLineTo DDI para traçar a linha. No entanto, se o minidriver da impressora tiver indicado que pretende conectar chamadas para esse DDI, DrvLineTo encaminhará imediatamente a chamada para a função OEMLineTo do IHV.

Um IHV pode implementar OEMLineToou qualquer uma das outras funções de intercepção descritas em Funções Não-COM-Based DDI Hook-Out, para lidar completamente com a operação de renderização, ou pode recorrer ao driver principal para manipular essa operação.

OEMLineTo pode ser implementado como mostrado no seguinte exemplo de pseudocódigo:

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,));
}

No exemplo anterior, a expressão

poempdev->pfnUnidrv[UD_DrvLineTo]

avalia para o endereço do driver principal DrvLineTo DDI. A expressão (PFN_DrvLineTo) que a precede converte o ponteiro da função para o tipo apropriado. Cada uma das funções de hook-out listadas nesta seção está associada ao seu próprio ponteiro de função.

Observe que quando um OEM Xxx DDI faz uma chamada de retorno para o driver principal Unidrv e a superfície envolvida é uma superfície gerida pelo dispositivo, o Unidrv pode simplesmente ignorar a chamada retornando FALSE.