選擇使用者模式或核心模式

重要

新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。

如需詳細資訊,請參閱 新式列印平臺列印支援應用程式設計指南

印表機圖形 DLL 的使用者模式執行提供下列優於內核模式執行的優點:

  • 無限制的堆疊空間。

  • 存取 Win32 API。

  • 造成系統當機的可能性較小。

  • 使用使用者模式調試程式更輕鬆地進行偵錯。

  • 較佳的浮點功能,因為不需要使用圖形 DDI 浮點函式。

  • 能夠呼叫不屬於所述Microsoft Windows 2000 和更新版本列印機驅動程序架構之任何自定義、廠商提供的使用者模式 DLL

在 Windows Vista 中,無法安裝內核模式印表機驅動程式。 如果應用程式嘗試這樣做,AddPrinterDriver 和 AddprinterDriverEx 函式(如 Windows SDK 檔所述)將會失敗,錯誤碼ERROR_KM_DRIVER_BLOCKED。

下表顯示允許的印表機驅動程式執行模式:

作業系統版本 印表機圖形 DLL 的允許執行模式
Windows NT 4.0 核心 (kernel)
Windows 2000 使用者或核心
Windows XP 和 Server 2003 適用於現有印表機的核心模式;新印表機安裝所需的使用者模式
Windows Vista 使用者

在使用者模式中使用圖形 DDI

使用者模式印表機圖形 DLL 不限於呼叫 GDI 支援服務 和其他 Eng 前置圖形 DDI 回呼函式。 不過,有一些規則必須遵循:

  • 如同核心模式圖形 DLL,使用者模式圖形 DLL 必須呼叫建立或修改繪圖介面的圖形 DIS。 這些回呼函式是 GDI 支援服務,而且不允許呼叫這些繪圖函式的 Win32 對等專案。

    對於使用者模式 DLL,這些繪圖回呼函式的呼叫會由使用者模式 GDI 用戶端攔截,然後傳遞對 GDI 核心模式圖形轉譯引擎 (GRE) 的呼叫。

  • 使用者模式 DLL 無法呼叫下列 Eng 前置圖形 DDI 函式清單:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • 使用者模式印表機圖形 DLL 可以繼續使用 GDI 浮點服務的圖形 DDI 函式。

將現有的印表機圖形 DLL 轉換成使用者模式

如果您先前已開發以核心模式執行的印表機圖形 DLL,您可以將 DLL 轉換成使用者模式執行。 若要轉換,請將DrvQueryDriverInfo函式新增至 DLL,然後遵循建置印表機圖形 DLL 的規則。

在使用者模式中建立新的印表機圖形 DLL

若要開發以使用者模式執行的新印表機圖形 DLL,您可以繼續使用核心模式 DLL 所使用的所有圖形 DDI 函式。 不過,您也有下列選項:

  • 對於具有確切 Win32 對等專案的 Eng 前置函式,建議您呼叫 Win32 函式。 下表列出這些 Eng 前置詞函式及其 Win32 對等函式。

    Eng-prefixed 函式 Win32 對等專案
    EngAllocMem HeapAlloc
    EngAllocUserMem HeapAlloc
    EngEnumForms EnumForms
    EngFreeMem HeapFree
    EngFreeUserMem HeapFree
    EngFindImageProcAddress GetProcAddress
    EngGetForm GetForm
    EngGetLastError GetLastError
    EngGetPrinter GetPrinter
    EngGetPrinterData GetPrinterData
    EngGetPrinterDriver GetPrinterDriver
    EngLoadImage LoadLibrary
    EngMulDiv MulDiv
    EngSetLastError SetLastError
    EngSetPrinterData SetPrinterData
    EngUnloadImage FreeLibrary
    EngWritePrinter WritePrinter
  • 針對對應至具有類似功能的 Win32 函式的 Eng 前置函式,也建議您呼叫 Win32 函式。 下表列出這些 Eng 前置詞函式中的數個,以及其 Win32 對應專案。

    Eng-prefixed 函式 Win32 對等專案
    EngAcquireSemaphore EnterCriticalSection
    EngCreateSemaphore 配置CRITICAL_SECTION物件,並使用 Win32 InitializeCriticalSection 函式的呼叫來初始化它。
    EngDeleteSemaphore DeleteCriticalSection
    EngFindResource FindResource
    EngFreeModule FreeLibrary
    EngLoadModule LoadLibrary
    EngMultiByteToWideChar MultiByteToWideChar
    EngQueryLocalTime GetLocalTime
    EngReleaseSemaphore ReleaseSemaphore
    EngWideCharToMultiByte WideCharToMultiByte
  • 對於建立或修改繪圖服務的函式,新的驅動程式必須繼續呼叫 GDI 支援服務 ,而不是其 Win32 對等專案。

  • 您可以使用 FLOAT 資料類型,而不是使用 GDI 浮點服務的圖形 DDI 函式。