사용자 모드 또는 커널 모드 선택

프린터 그래픽 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에서 호출할 수 없습니다.

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • 사용자 모드 프린터 그래픽 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