Freigeben über


JavaScript-Einschränkungen

Wichtig

Es wird empfohlen, den IPP-Klassentreiber von Microsoft zusammen mit Print Support Apps (PSA) zu verwenden, um die Druckoberfläche in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.

Weitere Informationen finden Sie im Leitfaden zum Erstellen von Druckunterstützungs-Apps.

Das Druckertreibermodell v4 unterstützt ein neues Modell für erweiterte Einschränkungs- und PrintTicket-Behandlung, das von der iPrintOemPrintTicketProvider-Schnittstelle v3 abgeleitet ist.

Anstatt jedoch ein kompiliertes Konfigurations-Plug-In zu verwenden, verwenden v4-Druckertreiber JavaScript, um APIs zu implementieren, die als JavaScript-Einschränkungen bezeichnet werden, und der Druckertreiber kann bei Bedarf eine oder mehrere davon 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 überprüfen und die Konvertierung von PrintTicket in DEVMODE zu verarbeiten und umgekehrt. JavaScript-Einschränkungen weisen jedoch einige Einschränkungen auf. Im Folgenden finden Sie eine Liste der einschränkungen der Standard:

  • 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 mit CompletePrintCapabilities hinzugefügt wurden, werden nicht in der öffentlichen DEVMODE beibehalten.

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

Daher wird empfohlen, JavaScript-Einschränkungen nur bei Bedarf zu verwenden. Features und Optionen sollten nach Möglichkeit in den GPD- oder PPD-Dateien angegeben werden, und nur komplizierte Einschränkungen sollten in JavaScript dargestellt werden.

Debuggen von JavaScript-Dateien

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

Javascript-Syntaxfehlerdialogfeld.

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

Das interaktive 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 druckt, keine empfohlene Test-/Debugstrategie. Stattdessen empfiehlt Microsoft, dass Hersteller eine Test-App erstellen, die alle relevanten Einstiegspunkte für JavaScript-Einschränkungen mithilfe der folgenden öffentlichen APIs aufruft: PTGetPrintCapabilities, PTConvertDevModeToPrintTicket, PTConvertPrintTicketToDevMode und PTMergeAndValidatePrintTicket.

Die Test-App allein reicht 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 behandelt. Weitere Informationen zum Erstellen von Komponententests in Visual Studio finden Sie im folgenden Thema:

Exemplarische Vorgehensweise für Komponententests mit Visual Studio Team Test

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

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

Wenn keine Fehler auftreten und Die Quelldatei erfolgreich analysiert wurde, 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 javaScript-Code für Einschränkungen

  3. Legen Sie diese Druckwarteschlange als Standard fest.

  4. Starten Sie Ihre Test-App oder eine App, die druckt, und beginnen Sie ein Szenario, in dem JavaScript-Einschränkungen aufgerufen werden. Die App muss die PrintTicket/PrintCapabilities-APIs aufrufen, um die JavaScript-Einschränkungen zu unterbrechen. Ältere Apps wie Editor rufen diese APIs nicht auf, aber die XPS Viewer-App tut dies. Microsoft empfiehlt hier die Verwendung einer Test-App, da die Szenarien einfacher isoliert und reproduziert werden können.

  5. Zu diesem Zeitpunkt wird der "Visual Studio Just-In-Time-Debugger" mit der Meldung "Eine nicht behandelte Ausnahme ist in <Ihrer App> aufgetreten" angezeigt.

  6. Starten einer neuen instance 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. Wechseln Sie nun zurück zum Dialogfeld "Visual Studio Just-In-Time-Debugger", und klicken Sie auf "Nein".

  12. Visual Studio unterbricht den Debugger an dem Speicherort, der vom aktuellen Test aufgerufen wird. 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 entspricht in der Funktion der IPrintOemPrintTicketProvider::ValidatePrintTicket-API .

validatePrintTicket-Syntax

function validatePrintTicket(printTicket, scriptContext)

validatePrintTicket-Parameter

  • Printticket

    [in] [out] Das zu überprüfende IPrintSchemaTicket-Objekt .

  • scriptContext

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

validatePrintTicket-Rückgabewert

Rückgabewert BESCHREIBUNG
0 Gibt an, dass der printTicket-Parameter 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, um das Ändern des PrintCapabilities-Objekts zu ermöglichen. 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 könnten (z. B. geschachtelte Featuredefinitionen). Dies entspricht in der Funktion der IPrintOemPrintTicketProvider::CompletePrintCapabilities-API .

completePrintCapabilities-Syntax

function completePrintCapabilities(printTicket, scriptContext, printCapabilities)

completePrintCapabilities-Parameter

  • Printticket

    [in] Die IPrintSchemaTicket-Objekteingabe , auf die das generierte PrintCapabilities-Dokument eingeschränkt werden soll.

  • scriptContext

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

  • Printcapabilities

    [in] [out] Das IPrintSchemaCapabilities-Objekt , das das vom Konfigurationsmodul generierte PrintCapabilities-Basisobjekt darstellt.

completePrintCapabilities-Rückgabewert

Keine.

convertDevModeToPrintTicket-Funktion

Diese API wird aufgerufen, um Werte aus dem DEVMODE-Eigenschaftenbehälter in ein PrintTicket zu konvertieren. Dies entspricht in der Funktion der 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 bietet.

  • Printticket

    [in] [out] Das IPrintSchemaTicket-Objekt , das 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 entspricht in der Funktion der IPrintOemPrintTicketProvider::ConvertPrintTicketToDevMode-API , mit dem Unterschied, 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 bietet.

  • devModeProperties

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

convertPrintTicketToDevMode-Rückgabewert

Keine.

Bewährte Methoden für Einschränkungen

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

Wenn beispielsweise die PageMediaType-Option "Photo" nur mit einem PageResolution-Wert von 1200dpi funktioniert, können Benutzer nie den Fotomedientyp auswählen. In solchen Fällen ist es besser, die Absicht des Benutzers (Fotomedien) abzugleichen und alle einstellungen anzupassen, die dazu erforderlich sind. Diese Anpassungen können im JavaScript-Einschränkungscode vorgenommen werden.

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

Weitere Informationen zur Verwendung von JavaScript-Einschränkungen finden Sie im Beispiel drucktreibereinschränkungen.