非 COM 型轉譯外掛程式
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
印表機迷你驅動程式會實作 OEMEnableDriver 函式,以通知其功能的核心驅動程式,其會填入DRVENABLEDATA結構的成員。 這個結構的 pdrvfn 成員應該使用DRVFN結構的數位地址來設定。 此陣列的每個元素都應該使用函式索引初始化,以及 IHV 所實作之 其中一個 OEMXxx 函式的位址。 (如需每個 的詳細描述OEMXxx 函式,請參閱 非 COM 型 DDI 攔截輸出函式。)
當應用程式呼叫 Microsoft Win32 GDI 來執行轉譯工作時,Win32 GDI 會接著呼叫 Unidrv 或 Pscript5 核心驅動程式,而後者通常會處理工作。 不過,如果印表機迷你驅動程式指出它能夠攔截特定的轉譯作業,核心驅動程式會將轉譯工作傳遞至 IHV 轉譯外掛程式。
例如,請考慮呼叫 Win32 LineTo API 的應用程式(如 Windows SDK 檔中所述)。 一般而言,這會導致再次呼叫核心驅動程式的 DrvLineTo DDI來繪製線條。 不過,如果印表機 minidriver 表示其打算掛接此 DDI 的呼叫,DrvLineTo 會立即將呼叫轉送至 IHV 的 OEMLineTo 函式。
IHV 可以實作 OEMLineTo,或非 COM 型 DDI Hook-Out 函式中所述的任何其他攔截函式,讓它可以完全處理轉譯作業,也可以回呼讓核心驅動程式處理該作業。
OEMLineTo 可以實作,如下列虛擬程式碼範例所示:
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,));
}
在上述範例中,表達式
poempdev->pfnUnidrv[UD_DrvLineTo]
評估為核心驅動程式 DrvLineTo DDI的位址。 前面將函式指標轉換成適當類型的 (PFN_DrvLineTo) 表達式。 本節所列的每個勾點函式都會與其自己的函式指標相關聯。
請注意,當 OEMXxx DDI 回呼 Unidrv 核心驅動程式,且涉及的表面是裝置管理的介面時,Unidrv 只需傳回 FALSE 即可忽略呼叫。