共用方式為


撰寫 64 位印表機驅動程式

重要

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

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

如果您要撰寫 64 位驅動程式或撰寫可在 32 位和 64 位系統上執行的驅動程式,請遵循將驅動程式移植到 64 位 Windows 中的 64 位移植指導方針。 本主題描述您在撰寫 64 位印表機驅動程式時可能會遇到的一些限制和問題。

如需使用裝飾來識別 64 位架構的詳細資訊,請參閱下列主題:

裝置內容句柄的限制

如果 32 位應用程式是在 64 位版本的 Microsoft Windows 作業系統上執行,則Splwow64.exe啟動進程內容中執行的印表機驅動程式外掛程式外掛程式不應該呼叫 GDI CreateDC 函式;此呼叫將會失敗。

撰寫 64 位驅動程序的問題

在現有的32位驅動程式程式代碼中,請小心指標類型和整數類型之間的轉換,例如 DWORD 或ULONG。 如果您有為 32 位機器撰寫程式代碼的經驗,您可能會用來假設指標值適合 DWORD 或 ULONG。 對於64位程式代碼,此假設很危險。 如果您將指標轉換成 DWORD 或 ULONG 類型,可能會截斷 64 位指標。

相反地,將指標轉換成類型DWORD_PTR或ULONG_PTR。 不論程式代碼是針對 32 位或 64 位電腦編譯的程式代碼,DWORD_PTR或ULONG_PTR類型的不帶正負號整數永遠足以儲存整個指標。

例如,OEMCUIPPARAM 結構中的 pDrvOptItems.UserData 指標字段的類型為 ULONG_PTR。 下列程式代碼範例示範如果您將 64 位指標值複製到此字段,該怎麼辦。

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG)pData;  // Wrong

上述程式代碼範例會將 pData 指標轉換成類型 ULONG,如果 sizeof(pData) sizeofULONG) >會截斷指標值。 正確的方法是將指標轉換成ULONG_PTR,如下列程式代碼範例所示。

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG_PTR)pData;  // Correct

上述程式代碼範例會保留指標值的所有 64 位。

內嵌 64 位函式,例如 PtrToUlongUlongToPtr ,可以安全地在指標和整數類型之間轉換,而不需依賴這些類型的相對大小假設。 如果某個類型比另一個類型短,則必須在轉換成較長的類型時加以擴充。 如果以符號位或零填滿來擴充較短的類型,則每個 Win64 函式都可以處理這些情況。 請考慮下列程式碼範例。

ULONG ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = ULONG(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // wrong

您應該將上述程式代碼範例取代為下列程式代碼範例。

ULONG_PTR ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = PtrToUlong(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // correct

即使建議使用第二個程式代碼範例

ulSlotPhysAddr

可能代表只有32位長而不是64位長的硬體緩存器值。 如需用於在指標和整數類型之間轉換的所有新 Win64 協助程式函式清單,請參閱 新的資料類型