다음을 통해 공유


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

Important

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

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

프린터 그래픽 DLL의 사용자 모드 실행은 커널 모드 실행보다 다음과 같은 이점을 제공합니다.

  • 무제한 스택 공간입니다.

  • Win32 API에 액세스합니다.

  • 시스템 충돌을 일으킬 가능성이 적습니다.

  • 사용자 모드 디버거를 사용하여 더 쉽게 디버깅할 수 있습니다.

  • 그래픽 DDI 부동 소수점 함수를 사용할 필요가 없으므로 부동 소수점 기능이 향상되었습니다.

  • 설명된 Microsoft Windows 2000 이상 프린터 드라이버 아키텍처의 일부가 아닌 사용자 지정 공급업체에서 제공하는 사용자 모드 DLL을 호출하는 기능

Windows Vista에서는 커널 모드 프린터 드라이버를 설치할 수 없습니다. 애플리케이션이 이를 시도하면 Windows SDK 설명서에 설명된 AddPrinterDriver 및 AddprinterDriverEx 함수가 실패하고 오류 코드가 ERROR_KM_DRIVER_BLOCKED.

다음 표에서는 허용되는 프린터 드라이버 실행 모드를 보여 줍니다.

운영 체제 버전 프린터 그래픽 DLL의 허용된 실행 모드
Windows NT 4.0 커널(kernel)
Windows 2000 사용자 또는 커널
Windows XP 및 Server 2003 기존 프린터에 사용할 수 있는 커널 모드; 새 프린터 설치에 필요한 사용자 모드
Windows Vista user

사용자 모드에서 그래픽 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 해당
    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 함수를 호출하는 것이 좋습니다. 다음 표에서는 Win32 대응 함수와 함께 이러한 Eng 접두사 함수 중 몇 가지를 나열합니다.

    Eng 접두사 함수 Win32 해당
    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 부동 소수점 서비스에 그래픽 DDI 함수를 사용하는 대신 FLOAT 데이터 형식을 사용할 수 있습니다.