共用方式為


Unidrv/PScript5 外掛程式組態模組

重要

新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。

如需詳細資訊,請參閱 新式列印平臺列印支援應用程式設計指南

使用 Windows Vista 中的 Unidrv 或 PScript5 設定外掛程式的 XPSDrv 打印驅動程式設定模組支援下列新功能:

PrintTicket 和 PrintCapabilities 介面支援

Unidrv 和 PScript5 列印驅動程式外掛程式會實 作 IPrintOemPrintTicketProvider 介面,以自定義 PrintTicket 和 PrintCapabilities 數據。 此介面中的 方法可讓外掛程式自定義外掛程式,以及外掛程式所提供的自定義功能 PrintTicket 和 PrintCapabilities 處理。

Unidrv 和 PScript5 列印驅動程式會實 作 IPrintTicketProvider 介面,併產生以 GPD 或 PPD 檔案為基礎的 PrintTicket 和 PrintCapabilities 數據的初始版本。 初始處理之後,Unidrv 或 PScript5 列印驅動程式接著會呼叫外掛程式的 IPrintOemPrintTicketProvider 介面,讓外掛程式可以在列印驅動程式將它傳回給呼叫的應用程式之前修改此數據。

IPrintCoreHelper 介面

IPrintCoreHelper 介面可讓列印驅動程式設定外掛程式:

  • 取得並設定 Unidrv 和 PScript5 列印驅動程式所使用之 DEVMODE 結構私用部分的值。

  • 列舉列印驅動程式功能、選項和條件約束。

  • 存取完整的 GPD 或部分 PPD 檔案內容。

外掛程式正確設定 Unidrv 或 PScript5 組態並啟用完整使用者介面 (UI) 取代功能的唯一方式是使用下列 IPrintCoreHelper 介面。

DECLARE_INTERFACE_(IPrintCoreHelper, IUnknown) {
  // IUnknown methods skipped
  STDMETHOD(CreateInstanceOfMSXMLObject)(...)
  STDMETHOD(EnumConstrainedOptions)(...)
  STDMETHOD(EnumFeatures)(...)
  STDMETHOD(EnumOptions)(...)
  STDMETHOD(GetOption)(...)
  STDMETHOD(SetOptions)(...)
  STDMETHOD(WhyConstrained)(...)
};

下列兩個額外的介面 IPrintCoreHelperUniIPrintCoreHelperPS 衍生自 IPrintCoreHelper 介面。 這些介面分別適用於 Unidrv 和 PScript5 列印驅動程式,並包含每個驅動程式唯一的其他方法。

DECLARE_INTERFACE_(IPrintCoreHelperUni, IUnknown) {
  // IUnknown methods skipped
  // IPrintCoreHelper methods skipped
  STDMETHOD(CreateDefaultGDLSnapshot)(...)
  STDMETHOD(CreateGDLSnapshot)(...)
};

DECLARE_INTERFACE_(IPrintCoreHelperPS, IUnknown) {
  // IUnknown methods skipped
  // IPrintCoreHelper methods skipped
  STDMETHOD(GetFeatureAttribute)(...)
  STDMETHOD(GetGlobalAttribute)(...)
  STDMETHOD(GetOptionAttribute)(...)
};

下列程式代碼範例說明如何使用 IPrintCoreHelper 介面從 DEVMODE 結構查詢資訊。 此範例是 Windows 驅動程式套件 (WDK) 中 XPSDrv 列印驅動程式範例程式代碼的一部分。

HRESULT
CBookletDMPTConv::GetDrvSettingsFromDM(
    __in    PDEVMODE                         pDevmode,
            ULONG                            cbDevmode,
    __out   GPD::Binding::DrvSettings*       pDrvSettings
    )
{
  HRESULT hr = S_OK;

  for (GPD::Binding::EGPDSettings setting = 
        GPD::Binding::EGPDSettingsMin;
      setting < GPD::Binding::EGPDSettingsMax && SUCCEEDED(hr);
      setting++)
  {
    PCSTR pszOption;
    hr = m_pCoreHelper->GetOption(
      pDevmode,
      cbDevmode, 
      m_featureNames[setting], 
      &pszOption)
    if (SUCCEEDED(hr))
    {
      hr = GPDSettingFromOptionString(
      pszOption, 
      setting, 
      pDrvSettings);
    }
  }

  return hr;
}