다음을 통해 공유


JavaScript 제약 조건

Important

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

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

v4 프린터 드라이버 모델은 v3 IPrintOemPrintTicketProvider 인터페이스에서 파생된 확장된 제약 조건 및 PrintTicket 처리를 위한 새 모델을 지원합니다.

그러나 v4 프린터 드라이버는 컴파일된 구성 플러그 인을 사용하는 대신 JavaScript를 사용하여 JavaScript 제약 조건이라는 API를 구현하고 프린터 드라이버는 필요에 따라 하나 이상의 API를 구현할 수 있습니다. 자세한 내용은 이 항목의 끝에 있는 JavaScript 제약 조건 API 섹션의 함수를 참조하세요.

JavaScript 제약 조건은 PrintCapabilities를 보강하고 PrintTickets의 유효성을 검사하며 PrintTicket를 DEVMODE로 변환하는 데 사용할 수 있으며 그 반대의 경우도 마찬가지입니다. 그러나 JavaScript 제약 조건에는 몇 가지 제한 사항이 있습니다. 다음은 주요 제한 사항 목록입니다.

  • CompletePrintCapabilities를 사용하여 추가된 기능 및 옵션뿐만 아니라 validatePrintTicket에 지정된 제약 조건은 데스크톱 프린터 기본 설정 창에 표시되지 않습니다.

  • CompletePrintCapabilities를 사용하여 추가된 기능 및 옵션은 공용 DEVMODE에 유지되지 않습니다.

  • JavaScript 제약 조건은 리소스 dll의 언어 리소스에 액세스하여 추가된 기능 및 옵션 또는 매개 변수를 지역화할 수 없습니다.

따라서 JavaScript 제약 조건은 적절한 경우에만 사용하는 것이 좋습니다. 가능한 경우 GPD 또는 PPD 파일에서 기능 및 옵션을 지정해야 하며 복잡한 제약 조건만 JavaScript로 표시해야 합니다.

JavaScript 파일 디버깅

JavaScript 파일의 기본 구문 유효성 검사는 Windows 기반 스크립트 호스트에서 JavaScript 파일을 열어서 지원됩니다. 이렇게 하려면 JavaScript 파일을 마우스 오른쪽 단추로 클릭하고 [시작]을 선택하고 목록에서 Windows 기반 스크립트 호스트 항목을 선택합니다. 오류가 throw되지 않으면 JavaScript는 구문상 유효합니다. 그렇지 않으면 다음 스크린샷과 같이 문제의 줄 번호를 가리킵니다.

javascript 구문 오류 대화 상자

공개적으로 사용할 수 있는 JavaScript 유효성 검사 도구는 JavaScript 파일의 스타일을 평가하는 데 보좌관으로서 유용할 수도 있습니다.

다음 레지스트리 키를 만들어 대화형 디버깅을 사용하도록 설정할 수 있습니다.

키 이름: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

값 이름: EnableJavaScriptDebugging

형식: DWORD

값: 1

그러나 PrintConfig.dll 자주 로드되고 언로드되므로 인쇄되는 앱을 디버깅하는 것이 권장되는 테스트/디버깅 전략은 아닙니다. 대신, 제조업체는 PTGetPrintCapabilities, PTConvertDevModeToPrintTicket, PTConvertPrintTicketToDevModePTMergeAndValidatePrintTicket와 같은 공용 API를 사용하여 JavaScript 제약 조건에 대한 각 관련 진입점을 호출하는 테스트 앱을 빌드하는 것이 좋습니다.

테스트 앱만으로도 디버깅을 사용하도록 설정할 수 있지만 전체 드라이버가 예상대로 PrintTicket, PrintCapabilities 및 제약 조건을 처리하도록 단위 테스트를 추가하는 것도 유용합니다. Visual Studio에서 단위 테스트를 빌드하는 방법에 대한 자세한 내용은 다음 항목을 참조하세요.

Visual Studio 팀 테스트를 사용한 단위 테스트 연습

이전 텍스트에 표시된 레지스트리 키를 만들고 호스팅 프로세스가 다시 시작되면 JavaScript 원본 파일을 디버그할 수 있습니다.

원본 파일을 구문 분석하지 못하면 디버거가 호출되지 않으며 디버그 환경이 실패한 것처럼 보입니다. 원본 파일을 구문 분석하지 못하는 경우 진행 방법에 대한 자세한 내용은 Windows 스크립트 호스트를 참조하세요.

오류가 없고 원본 파일이 성공적으로 구문 분석된 경우 다음과 같이 원본 파일을 디버그합니다.

  1. 테스트 머신에 Microsoft Visual Studio 2012 이상 설치

  2. 제약 조건 JavaScript 코드가 있는 드라이버를 사용하여 인쇄 큐 만들기

  3. 이 인쇄 큐를 기본값으로 설정합니다.

  4. JavaScript 제약 조건을 호출하는 시나리오를 인쇄하고 시작하는 테스트 앱 또는 앱을 시작합니다. JavaScript 제약 조건에 침입하려면 앱이 PrintTicket/PrintCapabilities API를 호출해야 합니다. 메모장과 같은 이전 앱은 이러한 API를 호출하지 않지만 XPS 뷰어 앱은 호출합니다. 시나리오를 보다 쉽게 격리하고 재현할 수 있으므로 여기서 테스트 앱을 사용하는 것이 좋습니다.

  5. 이때 "Visual Studio Just-In-Time 디버거"가 "앱>에서 <처리되지 않은 예외가 발생했습니다"라고 표시됩니다.

  6. Visual Studio 2012 이상의 새 인스턴스 시작

  7. 디버그를 선택한 다음 프로세스에 연결

  8. 프로세스에 연결 대화 상자에서 연결 대상: 스크립트 코드로 설정되어 있는지 확인합니다.

  9. 이제 테스트 앱 또는 앱 인쇄를 선택하고 마지막으로 첨부를 선택합니다.

  10. "모두 중단"을 클릭합니다.

  11. 이제 "Visual Studio Just-In-Time 디버거" 대화 상자로 돌아가서 "아니요"를 클릭합니다.

  12. Visual Studio는 현재 테스트에 의해 호출된 위치에서 디버거에 침입합니다. 이제 코드를 정상적으로 디버그할 수 있습니다.

JavaScript 제약 조건 API

이 섹션에서는 JavaScript 제약 조건 파일에서 사용할 API 진입점 역할을 하는 함수를 지정합니다. 함수는 다음과 같습니다.

  • validatePrintTicket

  • completePrintCapabilities

  • convertDevModeToPrintTicket

  • convertPrintTicketToDevMode

validatePrintTicket 함수

이 API는 PrintTicket 개체가 특정 프린터에 대해 유효한지 확인하기 위해 호출됩니다. 이는 IPrintOemPrintTicketProvider::ValidatePrintTicket API와 함수에서 유사합니다.

validatePrintTicket 구문

function validatePrintTicket(printTicket, scriptContext)

validatePrintTicket 매개 변수

validatePrintTicket 반환 값

반환 값 설명
0 printTicket 매개 변수가 잘못되어 수정할 수 없음을 나타냅니다. E_PRINTTICKET_FORMAT 동일합니다.
1 printTicket 매개 변수가 이 프린터에 유효한 PrintTicket임을 나타냅니다. S_PT_NO_CONFLICT 동일합니다.
2 printTicket 매개 변수가 유효하도록 수정되었음을 나타냅니다. S_PT_CONFLICT_RESOLVED 동일합니다.

completePrintCapabilities 함수

이 API는 PrintCapabilities 개체를 수정할 수 있도록 호출됩니다. 이는 조건부 기능(예: 사진 용지에서만 지원됨) 또는 GPD 또는 PPD 파일(예: 중첩된 기능 정의)에서 생성할 수 없는 기능을 나타내는 데 사용해야 합니다. 이는 IPrintOemPrintTicketProvider::CompletePrintCapabilities API와 함수에서 유사합니다.

completePrintCapabilities 구문

function completePrintCapabilities(printTicket, scriptContext, printCapabilities)

completePrintCapabilities 매개 변수

completePrintCapabilities 반환 값

없음

convertDevModeToPrintTicket 함수

이 API는 DEVMODE 속성 모음의 값을 PrintTicket으로 변환하기 위해 호출됩니다. 이 구현은 DEVMODE의 프라이빗 섹션을 IPrinterScriptablePropertyBag 개체로 캡슐화하고 DEVMODE공용 섹션에 액세스할 수 없다는 점을 제외하고 IPrintOemPrintTicketProvider::ConvertDevModeToPrintTicket API와 함수에서 유사합니다.

convertDevModeToPrintTicket 구문

function convertDevModeToPrintTicket(devModeProperties, scriptContext, printTicket)

convertDevModeToPrintTicket 매개 변수

  • devModeProperties

[in] DEVMODE 속성 모음을 나타내는 IPrinterScriptablePropertyBag 개체입니다.

convertDevModeToPrintTicket 반환 값

없음

convertPrintTicketToDevMode 함수

이 API는 PrintTicket에서 DEVMODE 속성 모음으로 값을 변환하기 위해 호출됩니다. 이 구현은 DEVMODE의 프라이빗 섹션을 IPrinterScriptablePropertyBag 개체로 캡슐화하고 DEVMODE의 공용 섹션에 액세스할 수 없다는 점을 제외하고 IPrintOemPrintTicketProvider::ConvertPrintTicketToDevMode API와 함수에서 유사합니다.

convertPrintTicketToDevMode 구문

function convertPrintTicketToDevMode(printTicket, scriptContext, devModeProperties)

convertPrintTicketToDevMode 매개 변수

  • printTicket

    [in] 변환할 PrintTicket 를 나타내는 IPrintSchemaTicket 개체입니다.

  • scriptContext

    [in] 드라이버 속성 모음, 큐 속성 모음 및 사용자 속성 모음에 대한 액세스를 제공하는 IPrinterScriptContext 개체입니다.

  • devModeProperties

    [in] [out] DEVMODE 속성 모음을 나타내는 IPrinterScriptablePropertyBag 개체입니다.

convertPrintTicketToDevMode 반환 값

없음

제약 조건 모범 사례

Windows 8 인쇄 대화 상자 및 인쇄 기본 설정 환경은 인쇄 스키마 키워드 네임스페이스의 하위 집합만 지원합니다. 따라서 사용자가 이러한 제약 조건을 해결할 기회가 없으므로 Windows 8 인쇄 대화 상자에서 지원되는 기능 또는 인쇄 기본 설정 UI 및 해당 UI에 없는 기능 간에 제약 조건을 사용하지 않는 것이 좋습니다.

예를 들어 Photo라는 PageMediaType 옵션이 PageResolution 값 1200dpi로만 작동하도록 제한되는 경우 사용자는 사진 미디어 유형을 선택할 수 없습니다. 이와 같은 경우 사용자의 의도(사진 미디어)와 일치시키고 이를 발생하도록 하는 데 필요한 설정을 조정하는 것이 좋습니다. 이러한 조정은 JavaScript 제약 조건 코드에서 수행할 수 있습니다.

드라이버가 JavaScript 제약 조건을 사용하지 않는 경우 파일이 제공될 필요는 없습니다. 드라이버가 진입점의 하위 집합(예: validatePrintTicket)에 대해서만 JavaScript 제약 조건을 사용하는 경우 다른 진입점은 JavaScript 파일에서 완전히 생략되어야 합니다.