64비트 프린터 드라이버 작성

Important

최신 인쇄 플랫폼은 Windows에서 프린터와 통신하는 데 선호되는 수단입니다. 프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하려면 MICROSOFT의 IPP 받은 편지함 클래스 드라이버와 PSA(인쇄 지원 앱)를 사용하는 것이 좋습니다.

자세한 내용은 최신 인쇄 플랫폼 및 인쇄 지원 앱 디자인 가이드를 참조하세요.

64비트 드라이버를 작성하거나 32비트 및 64비트 시스템에서 실행되도록 컴파일할 수 있는 드라이버를 작성하는 경우 드라이버를 64비트 Windows로 포팅하는 64비트 포팅 지침을 따릅니다. 이 항목에서는 64비트 프린터 드라이버를 작성할 때 발생할 수 있는 몇 가지 제한 사항과 문제에 대해 설명합니다.

장식을 사용하여 64비트 아키텍처를 식별하는 방법에 대한 자세한 내용은 다음 항목을 참조하세요.

디바이스 컨텍스트 핸들의 제한 사항

32비트 애플리케이션이 Microsoft Windows 운영 체제의 64비트 버전에서 실행되는 경우 Splwow64.exe unking 프로세스의 컨텍스트에서 실행되는 프린터 드라이버 플러그 인은 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)> sizeof(ULONG)인 경우 포인터 값을 잘라낼 수 있습니다. 올바른 방법은 다음 코드 예제와 같이 포인터를 ULONG_PTR 캐스팅하는 것입니다.

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

앞의 코드 예제에서는 포인터 값의 64비트 모두를 유지합니다.

PtrToUlong 및 UlongToPtr같은 인라인 64비트 함수는 이러한 형식의 상대 크기에 대한 가정에 의존하지 않고 포인터와 정수 형식 간에 안전하게 변환됩니다. 한 형식이 다른 형식보다 짧은 경우 더 긴 형식으로 변환할 때 확장해야 합니다. 부호 비트 또는 0으로 채워 짧은 형식을 확장하면 각 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

는 64비트 길이가 아닌 32비트 길이의 하드웨어 레지스터 값을 나타낼 수 있습니다. 포인터와 정수 형식 간을 변환하기 위한 모든 새 Win64 도우미 함수 목록은 새 데이터 형식을 참조 하세요.