Vykreslování Plug-Ins bezCOM-Based

Důležitý

Moderní tisková platforma je upřednostňovaná pro komunikaci s tiskárnami ve Windows. Doporučujeme použít ovladač třídy doručené pošty IPP od Microsoftu spolu s tiskovými podpůrnými aplikacemi (PSA) k přizpůsobení prostředí tisku ve Windows 10 a 11 pro vývoj zařízení tiskárny.

Další informace najdete v průvodci návrhem aplikace podpory tisku v1 a v2.

Minidriver tiskárny oznamuje základnímu ovladači své schopnosti implementací funkce OEMEnableDriver, která vyplňuje členy struktury DRVENABLEDATA. pdrvfn člen této struktury by měl být nastaven s maticovou adresou DRVFN struktur. Každý prvek tohoto pole by měl být inicializován indexem funkce a adresou jedné z funkcí OEMXxx, které implementuje IHV. (Podrobné popisy jednotlivých funkcí OEMXxx najdete v tématu Ne-COM-Based DDI Hook-Out Funkce.)

Když aplikace volá Microsoft Win32 GDI k provedení úlohy vykreslování, Win32 GDI zase volá do ovladače jádra Unidrv nebo Pscript5, který ji obvykle zpracovává. Pokud však minidriver tiskárny uvedl, že dokáže připojit konkrétní operaci vykreslování, hlavní ovladač předá úlohu vykreslování modulu plug-in pro vykreslování IHV.

Představte si například aplikaci, která volá rozhraní API LineTo Win32 (popsané v dokumentaci k sadě Windows SDK). Obecně by to vedlo k dalšímu volání ovladače jádra DrvLineTo DDI, aby se nakreslila čára. Pokud minidriver tiskárny uvedl, že hodlá připojit volání této DDI, DrvLineTo okamžitě přesměruje volání na funkci IHV OEMLineTo.

IHV může implementovat OEMLineTonebo jakoukoli jinou hook-out funkci popsanou v Non-COM-Based DDI Hook-Out Functionstak, aby mohl zcela zpracovat operaci vykreslování, nebo může použít zpětné volání k tomu, aby základní ovladač zpracoval tuto operaci.

OEMLineTo lze implementovat, jak je znázorněno v následujícím příkladu pseudokódu:

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

V předchozím příkladu výraz

poempdev->pfnUnidrv[UD_DrvLineTo]

vyhodnotí adresu DrvLineTo DDI základního ovladače. Výraz (PFN_DrvLineTo) přetypovává ukazatel funkce na příslušný typ. Každá funkce připojení uvedená v této části je přidružena k vlastnímu ukazateli funkce.

Všimněte si, že když výrobce OEMXxx DDI volá zpět do jádra ovladače Unidrv a příslušný povrch je povrch spravovaný přímo zařízením, může Unidrv jednoduše volání ignorovat vrácením FALSE.