Freigeben über


JavaScript-Einschränkungen

Wichtig

Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.

Weitere Informationen finden Sie im Print support app design guide.

Das v4-Druckertreibermodell unterstützt ein neues Modell für die erweiterte Einschränkung und die PrintTicket-Handhabung, die von der v3 IPrintOemPrintTicketProvider-Schnittstelle abgeleitet wird.

Anstatt jedoch ein kompiliertes Konfigurations-Plug-In zu verwenden, verwenden v4-Druckertreiber JavaScript, um APIs namens JavaScript-Einschränkungen zu implementieren, und der Druckertreiber kann einen oder mehrere davon nach Bedarf implementieren. Weitere Informationen finden Sie in den Funktionen im Abschnitt "JavaScript-Einschränkungs-APIs " am Ende dieses Themas.

JavaScript-Einschränkungen können verwendet werden, um PrintCapabilities zu erweitern, PrintTickets zu validieren und die Konvertierung von PrintTicket in DEVMODE zu verarbeiten und umgekehrt. JavaScript-Einschränkungen weisen jedoch einige Einschränkungen auf. Es folgt eine Liste der wichtigsten Einschränkungen:

  • Features und Optionen, die mithilfe von CompletePrintCapabilities hinzugefügt wurden, sowie Einschränkungen, die in validatePrintTicket angegeben sind, werden nicht im Fenster mit den Desktopdruckereinstellungen angezeigt.

  • Features und Optionen, die mithilfe von CompletePrintCapabilities hinzugefügt werden, werden nicht in der öffentlichen DEVMODE beibehalten.

  • JavaScript-Einschränkungen können nicht auf Sprachressourcen aus Ressourcen-DLLs zugreifen, um hinzugefügte Features und Optionen oder Parameter zu lokalisieren.

Daher wird empfohlen, dass JavaScript-Einschränkungen nur bei Bedarf verwendet werden. Features und Optionen sollten in den GPD- oder PPD-Dateien angegeben werden, sofern möglich, und nur komplizierte Einschränkungen sollten in JavaScript dargestellt werden.

Debuggen von JavaScript-Dateien

Die grundlegende syntaktische Überprüfung von JavaScript-Dateien wird durch Öffnen der JavaScript-Datei im Windows-basierten Skripthost unterstützt. Klicken Sie dazu mit der rechten Maustaste auf die JavaScript-Datei, und wählen Sie " Öffnen mit" aus, und wählen Sie den Windows-basierten Skripthosteintrag in der Liste aus. Wenn keine Fehler ausgelöst werden, ist das JavaScript syntaktisch gültig. Andernfalls verweist sie auf die Zeilennummer des Problems, wie im folgenden Screenshot gezeigt.

Javascript-Syntaxfehlerdialogfeld.

Öffentlich verfügbare JavaScript-Validierungstools können auch als Aide bei der Auswertung des Stils von JavaScript-Dateien hilfreich sein.

Interaktives Debuggen kann durch Erstellen des folgenden Registrierungsschlüssels aktiviert werden:

Schlüsselname: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

Wertname: EnableJavaScriptDebugging

Typ: DWORD

Wert: 1

Da PrintConfig.dll jedoch häufig geladen und entladen wird, ist das Debuggen einer App, die gedruckt wird, keine empfohlene Test-/Debuggingstrategie. Stattdessen empfiehlt Microsoft, eine Test-App zu erstellen, die jeden der relevanten Einstiegspunkte für JavaScript-Einschränkungen mithilfe dieser öffentlichen APIs aufruft: PTGetPrintCapabilities, PTConvertDevModeToPrintTicket, PTConvertPrintTicketToDevMode und PTMergeAndValidatePrintTicket.

Die Test-App reicht allein aus, um das Debuggen zu ermöglichen, aber es ist auch vorteilhaft, Komponententests hinzuzufügen, um sicherzustellen, dass der gesamte Treiber PrintTicket, PrintCapabilities und Einschränkungen wie erwartet verarbeitet. Weitere Informationen zum Erstellen von Komponententests in Visual Studio finden Sie im folgenden Thema:

Exemplarische Vorgehensweise zum Testen von Komponenten mit Visual Studio-Teamtest

Nachdem der im vorherigen Text angezeigte Registrierungsschlüssel erstellt wurde und der Hostingprozess neu gestartet wurde, können Sie die JavaScript-Quelldatei debuggen.

Es ist wichtig zu beachten, dass, wenn die Quelldatei nicht analysiert werden kann, der Debugger nicht aufgerufen wird und so aussieht, als ob die Debugumgebung fehlgeschlagen ist. Wenn die Quelldatei nicht analysiert werden kann, finden Sie weitere Informationen zum Fortfahren unter Windows Script Host .

Wenn keine Fehler vorhanden sind und die Quelldatei erfolgreich analysiert wird, debuggen Sie die Quelldatei wie folgt:

  1. Installieren von Microsoft Visual Studio 2012 oder höher auf dem Testcomputer

  2. Erstellen einer Druckwarteschlange mithilfe des Treibers mit den Einschränkungen des JavaScript-Codes

  3. Legen Sie diese Druckwarteschlange als Standard fest.

  4. Starten Sie Ihre Test-App oder eine App, die druckt, und beginnen Sie ein Szenario, das dazu führt, dass JavaScript-Einschränkungen aufgerufen werden. Die App muss die PrintTicket/PrintCapabilities-APIs aufrufen, um die JavaScript-Einschränkungen aufzubrechen; Ältere Apps wie Editor rufen diese APIs nicht auf, die XPS Viewer-App jedoch. Microsoft empfiehlt die Verwendung einer Test-App hier, da die Szenarien einfacher isoliert und reproduziert werden können.

  5. Derzeit wird der "Just-In-Time-Debugger von Visual Studio" mit der Meldung "In Ihrer App> ist eine unbehandelte Ausnahme aufgetreten<" angezeigt.

  6. Starten einer neuen Instanz von Visual Studio 2012 oder höher

  7. Wählen Sie "Debuggen" und dann "An Prozess anfügen" aus.

  8. Stellen Sie im Dialogfeld "An Prozess anhängen" sicher, dass "Anfügen an:" auf Skriptcode festgelegt ist.

  9. Wählen Sie nun die Test-App oder app-Druck aus, und wählen Sie schließlich "Anfügen" aus.

  10. Klicken Sie auf "Alle unterbrechen"

  11. Kehren Sie nun zum Dialogfeld "Just-In-Time-Debugger" von Visual Studio zurück, und klicken Sie auf "Nein".

  12. Visual Studio unterbricht an der vom aktuellen Test aufgerufenen Position in den Debugger. Sie können den Code jetzt normal debuggen.

JavaScript-Einschränkungs-APIs

In diesem Abschnitt werden die Funktionen angegeben, die als API-Einstiegspunkte für die Verwendung in der JavaScript-Einschränkungsdatei dienen. Dies sind die Funktionen:

  • validatePrintTicket

  • completePrintCapabilities

  • convertDevModeToPrintTicket

  • convertPrintTicketToDevMode

validatePrintTicket-Funktion

Diese API wird aufgerufen, um zu überprüfen, ob ein PrintTicket-Objekt für einen bestimmten Drucker gültig ist. Dies ist analog zur IPrintOemPrintTicketProvider::ValidatePrintTicket-API.

validatePrintTicket-Syntax

function validatePrintTicket(printTicket, scriptContext)

validatePrintTicket-Parameter

validatePrintTicket-Rückgabewert

Rückgabewert BESCHREIBUNG
0 Gibt an, dass der parameter printTicket ungültig war und nicht korrigiert werden konnte. Entspricht E_PRINTTICKET_FORMAT.
1 Gibt an, dass der printTicket-Parameter ein gültiges PrintTicket für diesen Drucker ist. Entspricht S_PT_NO_CONFLICT.
2 Gibt an, dass der printTicket-Parameter geändert wurde, um ihn gültig zu machen. Entspricht S_PT_CONFLICT_RESOLVED.

completePrintCapabilities-Funktion

Diese API wird aufgerufen, damit das PrintCapabilities-Objekt geändert werden kann. Dies sollte für bedingte Features verwendet werden (z. B. wird "Rahmenlos" nur auf Fotopapier unterstützt) oder um Features darzustellen, die andernfalls nicht von einer GPD- oder PPD-Datei generiert werden konnten (z. B. geschachtelte Featuredefinitionen). Dies ist analog zur IPrintOemPrintTicketProvider::CompletePrintCapabilities-API.

completePrintCapabilities-Syntax

function completePrintCapabilities(printTicket, scriptContext, printCapabilities)

completePrintCapabilities-Parameter

completePrintCapabilities-Rückgabewert

Keine.

convertDevModeToPrintTicket-Funktion

Diese API wird aufgerufen, um Werte aus dem DEVMODE-Eigenschaftenbehälter in ein PrintTicket zu konvertieren. Dies ist analog zur IPrintOemPrintTicketProvider::ConvertDevModeToPrintTicket-API, mit der Ausnahme, dass diese Implementierung den privaten Abschnitt des DEVMODE in ein IPrinterScriptablePropertyBag -Objekt kapselt und keinen Zugriff auf den öffentlichen Abschnitt des DEVMODE zulässt.

convertDevModeToPrintTicket-Syntax

function convertDevModeToPrintTicket(devModeProperties, scriptContext, printTicket)

convertDevModeToPrintTicket-Parameter

  • devModeProperties

[in] Das IPrinterScriptablePropertyBag -Objekt, das den DEVMODE-Eigenschaftenbehälter darstellt.

  • scriptContext

    [in] Das IPrinterScriptContext -Objekt, das Zugriff auf den Treibereigenschaftenbehälter, den Warteschlangeneigenschaftenbehälter und den Benutzereigenschaftenbehälter ermöglicht.

  • printTicket

    [in] [out] Das IPrintSchemaTicket -Objekt, das PrintTicket darstellt.

convertDevModeToPrintTicket-Rückgabewert

Keine.

convertPrintTicketToDevMode-Funktion

Diese API wird aufgerufen, um Werte aus einem PrintTicket in den DEVMODE-Eigenschaftenbehälter zu konvertieren. Dies ist analog zur IPrintOemPrintTicketProvider::ConvertPrintTicketToDevMode-API, mit der Ausnahme, dass diese Implementierung den privaten Abschnitt des DEVMODE in ein IPrinterScriptablePropertyBag -Objekt kapselt und keinen Zugriff auf den öffentlichen Abschnitt des DEVMODE zulässt.

convertPrintTicketToDevMode-Syntax

function convertPrintTicketToDevMode(printTicket, scriptContext, devModeProperties)

convertPrintTicketToDevMode-Parameter

  • printTicket

    [in] Das IPrintSchemaTicket-Objekt , das das zu konvertierende PrintTicket darstellt.

  • scriptContext

    [in] Das IPrinterScriptContext -Objekt, das Zugriff auf den Treibereigenschaftenbehälter, den Warteschlangeneigenschaftenbehälter und den Benutzereigenschaftenbehälter ermöglicht.

  • devModeProperties

    [in] [out] Das IPrinterScriptablePropertyBag -Objekt, das den DEVMODE-Eigenschaftenbehälter darstellt.

convertPrintTicketToDevMode-Rückgabewert

Keine.

Bewährte Methoden für Einschränkung

Das Windows 8-Druckdialogfeld und die Druckeinstellungen unterstützen nur eine Teilmenge des Namespace "Print Schema Keywords". Daher empfiehlt Microsoft nicht die Verwendung von Einschränkungen zwischen Features, die im Windows 8-Druckdialogfeld oder in den Druckeinstellungen der Benutzeroberfläche und features unterstützt werden, da Benutzer keine Möglichkeit haben, solche Einschränkungen zu beheben.

Wenn die Option "PageMediaType" mit dem Namen "Foto" beispielsweise auf die Verwendung eines PageResolution-Werts von 1200dpi beschränkt ist, können Benutzer niemals den Medientyp "Foto" auswählen. In solchen Fällen ist es besser, den Absichten des Benutzers (Fotomedien) zu entsprechen und alle einstellungen anzupassen, die erforderlich sind, um dies vorzunehmen. Diese Anpassungen können im JavaScript-Einschränkungscode vorgenommen werden.

Wenn ein Treiber keine JavaScript-Einschränkungen verwendet, besteht keine Anforderung, dass eine Datei bereitgestellt wird. Wenn ein Treiber JavaScript-Einschränkungen nur für eine Teilmenge der Einstiegspunkte verwendet (z. B. validatePrintTicket), sollten die anderen Einstiegspunkte vollständig aus der JavaScript-Datei weggelassen werden.