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.