사용자 모드 또는 커널 모드 선택
프린터 그래픽 DLL의 사용자 모드 실행은 커널 모드 실행보다 다음과 같은 이점을 제공합니다.
무제한 스택 공간입니다.
Win32 API에 액세스합니다.
시스템 충돌을 일으킬 가능성이 적습니다.
사용자 모드 디버거를 사용하여 더 쉽게 디버깅할 수 있습니다.
그래픽 DDI 부동 소수점 함수를 사용할 필요가 없으므로 부동 소수점 기능이 향상되었습니다.
설명된 Microsoft Windows 2000 이상 프린터 드라이버 아키텍처의 일부가 아닌 공급업체에서 제공하는 사용자 지정 사용자 모드 DLL을 호출하는 기능
Windows Vista에서는 커널 모드 프린터 드라이버를 설치할 수 없습니다. 애플리케이션이 이 작업을 수행하려고 하면 오류 코드 ERROR_KM_DRIVER_BLOCKED 함께 AddPrinterDriver 및 AddprinterDriverEx 함수(Windows SDK 설명서에 설명됨)가 실패합니다.
다음 표에서는 허용되는 프린터 드라이버 실행 모드를 보여 줍니다.
| 운영 체제 버전 | 프린터 그래픽 DLL의 허용된 실행 모드 |
|---|---|
Windows NT 4.0 |
커널(kernel) |
Windows 2000 |
사용자 또는 커널 |
Windows XP 및 Server 2003 |
기존 프린터에 사용할 수 있는 커널 모드; 새 프린터 설치에 필요한 사용자 모드 |
| Windows Vista | 사용자 |
사용자 모드에서 그래픽 DDI 사용
사용자 모드 프린터 그래픽 DLL은 GDI 지원 서비스 및 기타 Eng 접두사 그래픽 DDI 콜백 함수를 호출하는 것으로 제한되지 않습니다. 그러나 따라야 하는 몇 가지 규칙이 있습니다.
커널 모드 그래픽 DLL과 마찬가지로 사용자 모드 그래픽 DLL은 그리기 화면을 만들거나 수정하는 그래픽 DDI를 호출해야 합니다. 이러한 콜백 함수는 GDI 지원 서비스이며 이러한 그리기 함수에 해당하는 Win32 호출은 허용되지 않습니다.
사용자 모드 DLL의 경우 이러한 그리기 콜백 함수에 대한 호출은 사용자 모드 GDI 클라이언트에 의해 가로채고 GDI의 커널 모드 그래픽 렌더링 엔진(GRE)에 대한 호출을 전달합니다.
다음 Eng 접두사 그래픽 DDI 함수 목록은 사용자 모드 DLL에서 호출할 수 없습니다.
사용자 모드 프린터 그래픽 DLL은 GDI 부동 소수점 서비스에 그래픽 DDI 함수를 계속 사용할 수 있습니다.
기존 프린터 그래픽 DLL을 사용자 모드로 변환
이전에 커널 모드에서 실행되는 프린터 그래픽 DLL을 개발한 경우 DLL을 사용자 모드 실행으로 변환할 수 있습니다. 변환하려면 DLL에 DrvQueryDriverInfo 함수를 추가한 다음 프린터 그래픽 DLL을 빌드하는 규칙을 따릅니다.
사용자 모드에서 새 프린터 그래픽 DLL 만들기
사용자 모드에서 실행되는 새 프린터 그래픽 DLL을 개발하려면 커널 모드 DLL에서 사용하는 모든 그래픽 DDI 함수를 계속 사용할 수 있습니다. 그러나 다음과 같은 옵션도 있습니다.
정확한 Win32 함수가 있는 Eng 접두사 함수의 경우 Win32 함수를 호출하는 것이 좋습니다. 다음 표에서는 이러한 Eng 접두사 함수와 Win32 함수를 나열합니다.
Eng 접두사 함수 Win32 Equivalent 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 접두사 함수 Win32 Equivalent EngAcquireSemaphore
EnterCriticalSection
EngCreateSemaphore
CRITICAL_SECTION 개체를 할당하고 Win32 InitializeCriticalSection 함수에 대한 호출을 사용하여 초기화합니다.
EngDeleteSemaphore
DeleteCriticalSection
EngFindResource
FindResource
EngFreeModule
FreeLibrary
EngLoadModule
LoadLibrary
EngMultiByteToWideChar
MultiByteToWideChar
EngQueryLocalTime
GetLocalTime
EngReleaseSemaphore
ReleaseSemaphore
EngWideCharToMultiByte
WideCharToMultiByte
그리기 서비스를 만들거나 수정하는 함수의 경우 새 드라이버는 Win32 등가물 이 아닌 GDI 지원 서비스를 계속 호출해야 합니다.
GDI Floating-Point Services에 그래픽 DDI 함수를 사용하는 대신 FLOAT 데이터 형식을 사용할 수 있습니다.