Compartilhar via


Plug-ins de renderização não baseados em COM

Importante

A plataforma de impressão moderna é o meio preferencial do Windows para se comunicar com as impressoras. Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft juntamente com PSA (Aplicativos de Suporte à Impressão) 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 Plataformade impressão moderna e 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 descrições detalhadas de cada uma das funções OEMXxx, consulte Funções de conexão DDI não baseadas em COM.)

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 a API Win32 LineTo (descrita na documentação do SDK do Windows). Geralmente, isso resultaria em outra chamada para a DrvLineTo DDI do driver principal para desenhar a linha. No entanto, se o minidriver de impressora tiver indicado que pretende conectar chamadas a essa DDI, DrvLineTo encaminhará imediatamente a chamada para a função OEMLineTo.

Um IHV pode implementar OEMLineTo ou qualquer uma das outras funções de conexão descritas em Funções de Conexão DDI Não Baseadas em COM, para que ele possa lidar completamente com a operação de renderização ou pode chamar de volta para que o driver principal lide com essa operaçã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 como o endereço da DrvLineTo DDI do driver principal. A expressão (PFN_DrvLineTo) que a precede converte o ponteiro de função para o tipo apropriado. Cada uma das funções de conexão listadas nesta seção está associada ao seu próprio ponteiro de função.

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