Udostępnij przez


Wybieranie trybu użytkownika lub trybu jądra

Ważne

Nowoczesna platforma drukowania jest preferowanym sposobem komunikacji z drukarkami w systemie Windows. Zalecamy używanie sterownika klasy skrzynki odbiorczej IPP firmy Microsoft wraz z aplikacjami do obsługi drukowania (PSA), aby dostosować środowisko drukowania w systemie Windows 10 i 11 na potrzeby opracowywania urządzeń drukarki.

Aby uzyskać więcej informacji, zobacz Print Support App v1 and v2 design guide (Przewodnik projektowania aplikacji do obsługi wydruku w wersji 1 i 2).

Wykonywanie bibliotek DLL grafiki drukarki w trybie użytkownika zapewnia następujące korzyści w porównaniu z wykonywaniem w trybie jądra:

  • Nieograniczona przestrzeń stosu.

  • Dostęp do interfejsów API Win32.

  • Mniejszy potencjał powodowania awarii systemu.

  • Łatwiejsze debugowanie przy użyciu debugerów trybu użytkownika.

  • Lepsze możliwości zmiennoprzecinkowe, ponieważ korzystanie z funkcji zmiennoprzecinkowych graficznych DDI nie jest wymagane.

  • Możliwość wywoływania niestandardowych bibliotek DLL w trybie użytkownika dostarczonych przez dostawcę, które nie są częścią opisanej architektury sterownika drukarki systemu Microsoft Windows 2000 i nowszej

W systemie Windows Vista nie można zainstalować sterownika drukarki w trybie jądra. Jeśli aplikacja spróbuje to zrobić, funkcje AddPrinterDriver i AddPrinterDriverEx (opisane w dokumentacji zestawu Windows SDK) zakończą się niepowodzeniem z kodem błędu ERROR_KM_DRIVER_BLOCKED.

W poniższej tabeli przedstawiono dozwolone tryby wykonywania sterownika drukarki:

Wersja systemu operacyjnego Dozwolony tryb działania biblioteki DLL grafiki drukarki
Windows NT 4.0 jądro
Windows 2000 użytkownik lub jądro
Windows XP i Server 2003 tryb jądra dostępny dla istniejących drukarek; tryb użytkownika wymagany w przypadku nowych instalacji drukarek
Windows Vista użytkownik

Używanie graficznego identyfikatora DDI w trybie użytkownika

Biblioteka DLL grafiki drukarki w trybie użytkownika nie jest ograniczona do wywoływania usług wsparcia GDI i innych funkcji wywołania zwrotnego grafiki DDI z przedrostkiem Eng. Istnieją jednak pewne reguły, które należy przestrzegać:

  • Podobnie jak biblioteki DLL grafiki w trybie jądra, biblioteki DLL grafiki w trybie użytkownika muszą wywoływać graficzne identyfikatory DDI, które tworzą lub modyfikują powierzchnię rysunku. Te funkcje zwrotne są usługami wsparcia GDI, a wywoływanie odpowiedników w Win32 tych funkcji rysunkowych nie jest dozwolone.

    W przypadku bibliotek DLL trybu użytkownika wywołania zwrotne są przechwytywane przez klienta GDI trybu użytkownika, który następnie przekazuje te wywołania do silnika renderowania grafiki w trybie jądra GDI (GRE).

  • Poniższa lista graficznych funkcji DDI z prefiksem Eng nie może być wywoływana przez biblioteki DLL trybu użytkownika:

    EngCreatePath

    EngGetType1FontList

    EngMapModule

    EngDebugBreak

  • Biblioteki DLL grafiki w trybie użytkownika mogą nadal używać funkcji DDI grafiki dla usług zmiennoprzecinkowych GDI.

Konwertowanie istniejącej biblioteki DLL grafiki drukarki na tryb użytkownika

Jeśli wcześniej utworzono bibliotekę DLL grafiki drukarki, która jest wykonywana w trybie jądra, możesz przekonwertować bibliotekę DLL na wykonywanie w trybie użytkownika. Aby przekonwertować, dodaj funkcję DrvQueryDriverInfo do biblioteki DLL, a następnie postępuj zgodnie z regułami tworzenia biblioteki DLL grafiki drukarki.

Tworzenie nowej biblioteki DLL grafiki drukarki w trybie użytkownika

Aby opracować nową bibliotekę DLL grafiki drukarki, która jest wykonywana w trybie użytkownika, można nadal używać wszystkich funkcji graficznych DDI używanych przez biblioteki DLL trybu jądra. Dostępne są jednak również następujące opcje:

  • W przypadku funkcji prefiksowanych Eng, które mają dokładne odpowiedniki Win32, zaleca się wywołanie funkcji Win32. W poniższej tabeli zestawiono funkcje z prefiksem 'Eng' wraz z ich odpowiednikami Win32.

    Funkcja z prefiksem Eng Odpowiednik win32
    EngAllocMem HeapAlloc
    EngAllocUserMem HeapAlloc
    EngEnumForms EnumForms
    EngFreeMem StertaFree
    EngFreeUserMem StertaFree
    EngFindImageProcAddress GetProcAddress
    EngGetForm GetForm
    EngGetLastError GetLastError
    EngGetPrinter GetPrinter
    EngGetPrinterData GetPrinterData
    EngGetPrinterDriver PobierzSterownikDrukarki
    EngLoadImage LoadLibrary
    EngMulDiv MulDiv
    EngSetLastError SetLastError
    EngSetPrinterData SetPrinterData
    EngUnloadImage FreeLibrary
    EngWritePrinter WritePrinter
  • W przypadku funkcji prefiksowanych Eng, które odpowiadają funkcjom Win32 o podobnych funkcjach, zaleca się również wywoływanie funkcji Win32. W poniższej tabeli wymieniono kilka funkcji z prefiksem Eng wraz z ich odpowiednikami Win32.

    Funkcja z prefiksem Eng Odpowiednik win32
    EngAcquireSemaphore EnterCriticalSection
    EngCreateSemaphore Przydziel obiekt CRITICAL_SECTION i zainicjuj go za pomocą wywołania funkcji Win32 InitializeCriticalSection.
    EngDeleteSemaphore DeleteCriticalSection
    EngFindResource FindResource
    EngFreeModule FreeLibrary
    EngLoadModule LoadLibrary
    EngMultiByteToWideChar MultiByteToWideChar
    EngQueryLocalTime GetLocalTime
    EngReleaseSemaphore ReleaseSemaphore
    EngWideCharToMultiByte WideCharToMultiByte
  • W przypadku funkcji tworzących lub modyfikujących usługę rysowania nowe sterowniki muszą nadal wywoływać usługi pomocy technicznej GDI , a nie ich odpowiedniki Win32.

  • Zamiast używać funkcji DDI dla grafiki w usługach GDI Floating-Point, można użyć typu danych FLOAT.