Complementos de representación no basados en COM
Importante
La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.
Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.
Un minicontrolador de impresora notifica al controlador principal sus capacidades mediante la implementación de la función OEMEnableDriver, que rellena los miembros de una estructura DRVENABLEDATA. El miembro pdrvfn de esta estructura debe establecerse con la dirección de matriz de las estructuras DRVFN. Cada elemento de esta matriz debe inicializarse con un índice de función y la dirección de una de las funciones OEMXxx que implementa el IHV, respectivamente. (Para obtener descripciones detalladas de cada una de las funciones OEMXxx, consulte Funciones de enlace de DDI no basadas en COM).
Cuando una aplicación llama a Microsoft Win32 GDI para realizar una tarea de representación, Win32 GDI a su vez llama al controlador principal Unidrv o Pscript5, que normalmente controla la tarea. Sin embargo, si un minicontrolador de impresora ha indicado que es capaz de enlazar una operación de representación específica, el controlador principal pasa la tarea de representación al complemento de representación de IHV.
Por ejemplo, considere una aplicación que realiza una llamada a la API LineTo de Win32 (que se describe en la documentación del SDK de Windows). Por lo general, esto daría lugar a otra llamada a la DDI DrvLineTo del controlador principal para dibujar la línea. Si el minicontrolador de impresora ha indicado que pretende enlazar llamadas a esta DDI, DrvLineTo reenvía inmediatamente la llamada a la función OEMLineTo de IHV.
Un IHV puede implementar OEMLineTo, o cualquiera de las otras funciones de enlace descritas en Funciones de enlace de DDI no basadas en COM para que pueda controlar completamente la operación de representación o puede llamar de nuevo para que el controlador principal controle esa operación.
OEMLineTo podría implementarse como se muestra en el siguiente ejemplo 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,));
}
En el ejemplo anterior, la expresión
poempdev->pfnUnidrv[UD_DrvLineTo]
se evalúa como la dirección de la DDI DrvLineTo del controlador principal. La expresión (PFN_DrvLineTo) que precede a la conversión del puntero de función al tipo adecuado. Cada una de las funciones de enlace enumeradas en esta sección está asociada a su propio puntero de función.
Tenga en cuenta que cuando una DDI OEMXxx vuelve a llamar al controlador principal Unidrv y la superficie implicada es una superficie administrada por el dispositivo, Unidrv simplemente puede omitir la llamada devolviendo FALSE.