인쇄 작업 렌더링
인쇄 작업은 생성될 때 렌더링되거나 EMF 레코드로 스풀 파일에 기록됩니다. EMF 레코드의 경우 EMF 인쇄 프로세서 (localspl.dll)가 레코드를 재생할 때 렌더링이 발생합니다. 렌더링은 CreateDC(Microsoft Windows SDK 설명서에 설명됨)부터 사용자 모드 GDI 그리기 함수에 대한 일련의 호출로 구성됩니다. CreateDC 호출은 그래픽 렌더링 엔진(GRE, 커널 모드 GDI라고도 함) 및 프린터 그래픽 DLL과 관련된 일련의 작업으로 이어지는 일련의 애플리케이션 호출 중 첫 번째 호출입니다.
다음 그림에서는 CreateDC 가 호출된 후 커널 모드 GDI와 프린터 그래픽 DLL 간의 상호 작용을 보여 줍니다.

애플리케이션이 CreateDC 함수를 호출하여 프린터 디바이스 컨텍스트를 만들 때 GDI는 적절한 프린터 그래픽 DLL이 로드되었는지 확인합니다. 그렇지 않은 경우 GDI는 DLL을 로드하고 DLL에서 DrvEnableDriver 함수를 호출합니다. 드라이버가 다시 로드되지 않으면 함수가 다시 호출되지 않습니다.
다음으로, GDI는 드라이버가 물리적 디바이스 인스턴스를 만들고 디바이스 특성을 반환할 수 있도록 프린터 그래픽 DLL의 DrvEnablePDEV 함수를 호출합니다. GDI는 반환된 정보를 사용하여 디바이스 인스턴스에 대한 내부 설명을 만듭니다.
그런 다음 GDI는 그래픽 DLL의 DrvCompletePDEV 함수를 호출하여 디바이스 인스턴스에 GDI 핸들을 제공합니다. 그래픽 DLL은 GDI 그리기 엔진에서 제공하는 일부 Eng 접두사 콜백에 대한 입력으로 이 핸들을 사용해야 합니다( GDI 지원 서비스 참조).
GDI가 디바이스 인스턴스 핸들을 수신한 후 그리기 위해 표면을 설정하고 실제 디바이스 인스턴스와 연결하는 그래픽 DLL의 DrvEnableSurface 함수를 호출합니다.
드라이버는 EngCreateBitmap을 호출하여 디바이스 인스턴스에 대한 그리기 화면을 만들 수 있습니다. 또는 드로잉 화면이 디바이스 관리형인 경우 드라이버는 EngCreateDeviceSurface를 호출할 수 있습니다.
EngCreateBitmap이 전체 물리적 페이지를 포함할 수 있을 만큼 큰 비트맵을 제공할 수 없고 드라이버가 페이지 줄무늬를 지원하는 경우 EngMarkBandingSurface를 호출하여 GDI에 밴딩이 사용될 것임을 알릴 수 있습니다.
마지막으로, GDI가 생성된 표면을 지정된 디바이스 인스턴스와 연결하고, GDI가 이 특정 표면에 그릴 때 호출해야 하는 드라이버 제공 그래픽 DDI 그리기 함수(있는 경우)를 알 수 있도록 EngAssociateSurface 를 호출해야 합니다.
이때 그리기 화면이 만들어지고 렌더링이 시작될 수 있습니다. GDI에서 호출하는 함수는 밴딩이 적용되는지 여부에 따라 달라집니다.
사용 중인 밴딩
줄무늬를 사용할 때 렌더링할 각 문서에 대해 GDI는 프린터 그래픽 DLL에서 다음 함수를 호출합니다.
DrvStartDoc 각 물리적 페이지에 대해 { DrvStartPageDrvStartBanding 실제 페이지의 각 밴딩 패스에 대해{ DrvQueryPerBandInfo 렌더링 작업 DrvNextBand // 이 밴드에 대한 래스터 데이터 보내기, 다음 밴드와 함께 다시 사용할 표면 지우기 } } DrvEndDoc
사용 중이 아닌 밴딩
줄무늬를 사용하지 않을 때 렌더링할 각 문서에 대해 GDI는 프린터 그래픽 DLL에서 다음 함수를 호출합니다.
DrvStartDoc 각 물리적 페이지 DrvStartPage 렌더링 작업 DrvSendPage // 페이지에 대한 래스터 데이터 보내기 } DrvEndDocDrvQueryPerBandInfo를 제외하고, 이러한 함수는 프린터 그래픽 DLL이 프린터 하드웨어에 제어 시퀀스를 보낼 수 있도록 하고( EngWritePrinter를 호출하여) 문서 처리를 초기화하거나 완료하는 데 필요한 내부 작업을 수행하기 위한 것입니다. 페이지 또는 밴드입니다.
프린터 그래픽 DLL은 다음과 같이 렌더링된 이미지(즉, 드로잉 화면의 내용)를 적절한 시간에( EngWritePrinter를 호출하여) 프린터로 보내는 작업을 담당합니다.
GDI 관리형 또는 디바이스 관리 비트맵 표면의 경우
그리기 표면은 GDI 제공 비트맵 또는 드라이버 제공 비트맵입니다. 프린터 그래픽 DLL은 일부 그리기 함수를 후크할 수 있습니다( Surface 협상 참조). 페이지 줄무늬를 사용하는 경우 DrvNextBand 함수는 그리기 화면 콘텐츠를 보내야 합니다. 밴딩이 사용되지 않는 경우 DrvSendPage 함수는 그리기 화면 콘텐츠를 보내야 합니다.
디바이스 관리 벡터 표면의 경우
드로잉 화면이 디바이스 내에 있습니다. 프린터 그래픽 DLL은 모든 그리기 함수( Surface 협상 참조)를 후크하고 이러한 함수는 렌더링 작업 중에 이미지 데이터를 프린터로 보냅니다. 페이지 밴딩은 사용되지 않습니다.
프린터 그래픽 DLL에서 제공하는 그래픽 DDI 함수를 실행하는 데 5초 이상이 걸릴 수 있다고 예상하는 경우 인쇄 작업을 종료해야 하는지 확인하기 위해 EngCheckAbort 를 5초마다 호출하는 코드를 포함해야 합니다.
GDI가 DrvEndDoc 를 호출하여 문서가 완전히 렌더링되었음을 나타내면 DrvDisableSurface를 호출합니다. DrvEnableSurface가 EngCreateBitmap이라고 하는 경우 DrvDisableSurface는 EngDeleteSurface를 호출해야 합니다.
GDI는 애플리케이션이 DeleteDC를 호출할 때 프린터 그래픽 DLL의 DrvDisablePDEV 함수를 호출합니다.
문서를 인쇄하는 동안 애플리케이션이 ResetDC 함수를 호출하는 경우 GDI는 새 디바이스 컨텍스트를 만들고 새 컨텍스트에 대해 프린터 그래픽 DLL의 DrvEnablePDEV 함수를 호출합니다. 그런 다음 GDI는 DrvResetPDEV 함수를 호출하므로 그래픽 DLL은 이전 컨텍스트의 정보로 새 컨텍스트를 업데이트할 수 있습니다. 다음으로, DrvDisableSurface 및 DrvDisablePDEV 가 이전 컨텍스트에 대해 호출되고, 그 다음에 는 DrvEnableSurface 가 새 컨텍스트에 대해 호출됩니다. 마지막으로 GDI는 DrvStartDoc를 호출하고 새 페이지에서 다시 시작을 렌더링합니다.
GDI는 프린터 그래픽 DLL을 언로드하기 전에 DrvDisableDriver 를 호출합니다.
프린터 하드웨어가 GDI 그리기 함수에서 지원되지 않는 그리기 작업을 지원하는 경우 프린터 그래픽 DLL은 DrvDrawEscape 함수를 제공할 수 있습니다.
프린터 그래픽 DLL은 GDI 함수를 통해 사용할 수 없는 그리기 또는 비드라이빙 작업을 지원해야 하는 경우 DrvEscape 함수를 제공할 수 있습니다. 예를 들어 Microsoft 포스트스크립트 프린터 드라이버는 이스케이프를 사용하여 포스트스크립트 주입 지점을 지원합니다. 또는 애플리케이션에서 팩스 컴퓨터의 전화 번호를 가져와야 할 수도 있습니다. DrvEscape 함수는 DrvDrawEscape 함수에서 지원하는 작업을 나타내는 데도 사용됩니다.
CreateDC, ResetDC 및 DeleteDC는 Microsoft Windows SDK 설명서에 설명되어 있습니다.