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.