Compartilhar via


Plug-Ins de renderização não baseada em COM

Importante

Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft, juntamente com aplicativos de suporte de impressão (PSA), para personalizar a experiência de impressão em 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 de impressão.

Um minidriver de impressora notifica o driver principal de seus recursos implementando a função OEMEnableDriver , que preenche os membros de uma estrutura DRVENABLEDATA . O membro pdrvfn dessa estrutura deve ser definido com o endereço de matriz de 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 DDI não baseada em COM Hook-Out Functions.)

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 manipula a tarefa. No entanto, se um minidriver de impressora indicou que ele é capaz de conectar uma operação de renderização específica, o driver principal passa a tarefa de renderização para o plug-in de renderização IHV.

Por exemplo, considere um aplicativo que faz uma chamada para a API de LineTo do Win32 (descrito na documentação do SDK do Windows). Em geral, isso resultaria em outra chamada para a DDI DrvLineTo do driver principal para desenhar a linha. Se o minidriver da impressora indicou que pretende conectar chamadas a essa DDI, no entanto, DrvLineTo encaminha imediatamente a chamada para a função OEMLineTo do IHV.

Um IHV pode implementar o OEMLineTo ou qualquer uma das outras funções de conexão descritas no DDI não baseado em COM Hook-Out Functions, para que ele possa lidar completamente com a operação de renderização ou pode chamar de volta para que o driver principal manipule essa operação.

O OEMLineTo pode ser implementado conforme mostrado no exemplo de pseudocódigo a seguir:

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 o endereço da DDI DrvLineTo do driver principal. A expressão (PFN_DrvLineTo) que precede ela converte o ponteiro de função para o tipo apropriado. Cada uma das funções de gancho listadas nesta seção está associada ao próprio ponteiro de função.

Observe que quando um OEMXxx DDI chama de volta para o driver principal Unidrv e a superfície envolvida é uma superfície gerenciada pelo dispositivo, Unidrv pode simplesmente ignorar a chamada retornando FALSE.