Condividi tramite


Plug-in di rendering non basati su COM

Importante

La piattaforma di stampa moderna è il mezzo preferito di Windows per comunicare con le stampanti. Ti consigliamo di usare il driver di classe IPP di Microsoft, insieme a Print Support Apps (PSA), per personalizzare l'esperienza di stampa in Windows 10 e 11 per lo sviluppo di dispositivi per stampanti.

Per altre informazioni, vedere Piattaforma di stampa moderna e guida alla progettazione dell'app di supporto per la stampa.

Un minidriver della stampante notifica al driver principale delle relative funzionalità implementando la funzione OEMEnableDriver, che riempie i membri di una struttura DRVENABLEDATA. Il membro pdrvfn di questa struttura deve essere impostato con l'indirizzo della matrice delle strutture DRVFN . Ogni elemento di questa matrice deve essere inizializzato con un indice di funzione e l'indirizzo di una delle funzioni OEMXxx che viene implementato rispettivamente dall'IHV. (Per descrizioni dettagliate di ognuna delle Funzioni OEMXxx , vedere Funzioni hook-out DDI non basate su COM.

Quando un'applicazione chiama Microsoft Win32 GDI per eseguire un'attività di rendering, Win32 GDI a sua volta chiama il driver principale Unidrv o Pscript5, che in genere gestisce l'attività. Tuttavia, se un minidriver della stampante ha indicato che è in grado di associare un'operazione di rendering specifica, il driver principale passa l'attività di rendering al plug-in di rendering IHV.

Si consideri, ad esempio, un'applicazione che effettua una chiamata all'API LineTo Win32 (descritta nella documentazione di Windows SDK). In genere, si verificherebbe un'altra chiamata al drvLineTo DDI del driver principale per disegnare la linea. Se il minidriver della stampante ha indicato che intende associare le chiamate a questa DDI, tuttavia, DrvLineTo inoltra immediatamente la chiamata alla funzione OEMLineTo di IHV.

Un IHV può implementare OEMLineTo o una qualsiasi delle altre funzioni hook-out descritte in Funzioni hook-out non basate su COM, in modo che possa gestire completamente l'operazione di rendering oppure può richiamare per fare in modo che il driver principale gestisca tale operazione.

OEMLineTo può essere implementato come illustrato nell'esempio di pseudocodice seguente:

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,));
}

Nell'esempio precedente l'espressione

poempdev->pfnUnidrv[UD_DrvLineTo]

restituisce l'indirizzo del drvLineTo DDI del driver principale. Espressione (PFN_DrvLineTo) che precede il cast del puntatore della funzione al tipo appropriato. Ognuna delle funzioni hook-out elencate in questa sezione è associata al proprio puntatore a funzione.

Si noti che quando un OEMXxx DDI richiama il driver core Unidrv e la superficie coinvolta è una superficie gestita dal dispositivo, Unidrv può semplicemente ignorare la chiamata restituendo FALSE.