次の方法で共有


プリントプロセッサをインストール

印刷プロセッサをインストールするには、インストール アプリケーションでスプーラーの AddPrintProcessor 関数を呼び出す必要があります。 印刷プロセッサを印刷キューに関連付けるには、PrintProcessor エントリの INF ファイルにそのファイル名を一覧表示します。 このエントリは、印刷プロセッサを関連付けるすべての印刷キューに含める必要があります。 詳しくは、プリンター INF ファイルをご覧ください。

インストール アプリケーションは、入力引数として {PRINTER_INFO_2](/windows/win32/printdocs/printer-info-2) 構造体を使用してスプーラーの AddPrinter 関数を呼び出すときに、印刷プロセッサ名 (INF ファイルから取得) を構造体メンバーとして指定します。

印刷プロセッサと pnp がインストールされている印刷キューの関連付け

プラグ アンド プレイ (PnP) マネージャーが Windows 2000 または Windows XP を実行しているシステムで印刷キューを検出してインストールし、印刷キューのインストールに使用する INF ファイルに既定の Windows 印刷プロセッサ WinPrint 以外の PrintProcessor エントリが含まれている場合、印刷プロセッサは印刷キューに関連付けされません。 ただし、印刷プロセッサがインストールされます。

プリンターの追加ウィザードを使用して印刷キューをインストールすると、印刷プロセッサが印刷キューに正しく関連付けられていることに注意してください。

また、Microsoft Windows Server 2003 以降の PnP マネージャーは、印刷プロセッサを印刷キューに正しく関連付けます。

Windows 2000 および Windows XP でのプラグ アンド プレイインストールの印刷キューに印刷プロセッサを関連付けるには、プリンター インターフェイス DLL の DrvPrinterEvent 関数にPRINTER_EVENT_INITIALIZEケースを含めます。 Microsoft Windows Server 2003 以降では、DrvPrinterEvent 関数にPRINTER_EVENT_INITIALIZEケースを追加する必要はありません。

次のコード例では、PRINTER_INFO_2構造体の pPrintProcessor メンバーを印刷プロセッサの名前に設定し、SetPrinter 関数を呼び出してプリンターの設定を更新します。 gszPrintProc の印刷プロセッサの名前は、INF ファイルの PrintProcessor エントリの名前と同じである必要があることに注意してください。

BOOL
DrvPrinterEvent(
               LPWSTR  pPrinterName,
               INT     Event,
               DWORD   Flags,
               LPARAM  lParam
               )

{
  PRINTER_DEFAULTS  PrinterDef = {NULL, NULL, PRINTER_ALL_ACCESS};
  HANDLE            hPrinter;
  LPPRINTER_INFO_2  pInfo = NULL;
  DWORD             cbNeeded;
  TCHAR             gszPrintProc[] = TEXT("<Print processor name>");
  BOOL              bRet = TRUE;

  switch (Event)
  {
    case PRINTER_EVENT_INITIALIZE:
      if (OpenPrinter(pPrinterName, &hPrinter, &PrinterDef))
      {
        if ( !GetPrinter( hPrinter, 2, (LPBYTE) pInfo, 0, &cbNeeded ) &&
           (GetLastError() != ERROR_INSUFFICIENT_BUFFER) )
        {
          bRet = FALSE;
        }
        if (bRet == TRUE)
        {
          pInfo = (LPPRINTER_INFO_2) LocalAlloc(LPTR, cbNeeded);
          bRet = pInfo ? TRUE : FALSE;
        }
        if (bRet == TRUE)
        {
          if (GetPrinter(hPrinter, 2, (LPBYTE) pInfo, cbNeeded, &cbNeeded))
          {
            pInfo->pPrintProcessor = gszPrintProc;
            SetPrinter(hPrinter, 2, (LPBYTE) pInfo, 0);
          }
          else 
          {
            bRet = FALSE;
          }
          if (pInfo)
          {
            LocalFree(pInfo);
          }
        }
        ClosePrinter(hPrinter);
      }
      else  // OpenPrinter failed
      {
        bRet = FALSE;
      }
    break;
    // cases for other events

    default:
      break;
  }  // end switch
  return bRet;
}

プリンター ドライバーのアップグレード中の印刷プロセッサと印刷キューの関連付け

プリンター ドライバーが更新されると、更新された印刷キューの印刷プロセッサは変更されません。 新しいプリンター ドライバーに特定の印刷プロセッサが必要な場合、プリンター インターフェイス DLL の DrvUpgradePrinter 関数は、PRINTER_INFO_2構造体の pPrintProcessor メンバーを新しい印刷プロセッサの名前に設定する必要があります。 その後、この関数は SetPrinter を呼び出してプリンターの設定を更新します。 スプーラーは、プリンターごとに DrvUpgradePrinter 関数を 1 回呼び出します。これにより、そのドライバーを使用するすべてのプリンターで必要な印刷プロセッサも使用されます。 次のコード例は、これらの点を示します。

BOOL
DrvUpgradePrinter(
                 DWORD   Level,
                 LPBYTE  pDriverUpgradeInfo
                 )
{
  HANDLE                  hPrinter;
  PRINTER_DEFAULTS        PrinterDef = {NULL, NULL, PRINTER_ALL_ACCESS};
 PDRIVER_UPGRADE_INFO_2  pDUI2;
  LPPRINTER_INFO_2        pInfo = NULL;
 DWORD                   cbNeeded;
  TCHAR                   gszPrintProc[]   = TEXT("<Print processor name>");
  TCHAR                   gszPrintDriver[] = TEXT("<Printer driver name>");
  BOOL                    bRet = TRUE;

  if ((Level == 2)                                            &&
      (pDUI2 = (PDRIVER_UPGRADE_INFO_2)pDriverUpgradeInfo)    &&
      (OpenPrinter(pDUI2->pPrinterName, &hPrinter, &PrinterDef)))
  {
    if ( !GetPrinter( hPrinter, 2, (LPBYTE) pInfo, 0, &cbNeeded )  &&
         (GetLastError() != ERROR_INSUFFICIENT_BUFFER) )
    {
       bRet = FALSE;
    }
    if (bRet == TRUE)
    {
      pInfo = (LPPRINTER_INFO_2) LocalAlloc(LPTR, cbNeeded);
      bRet = pInfo ? TRUE : FALSE;
    }
    if (bRet == TRUE)
    {
      if (GetPrinter(hPrinter, 2, (LPBYTE) pInfo, cbNeeded, &cbNeeded))
      {
      //
      // This function is called for every printer queue that uses a driver
      // for which one or more files were updated. However, we only want to
      // update the printer queue's "driver" by a particular driver.
      //
      if ( !lstrcmpi(pInfo->pDriverName, gszPrintDriver) )
      {
        pInfo->pPrintProcessor =  gszPrintProc;
        SetPrinter(hPrinter, 2, (LPBYTE) pInfo, 0);
      }
    else  // GetPrinter 
    {
      bRet = FALSE;
    }
    if (pInfo)
    {
      LocalFree(pInfo);
    }
    ClosePrinter(hPrinter);
  }
  else  // Level != 2 or pDUI2 == NULL or OpenPrinter failed
  {
    bRet = FALSE;
  }
  return bRet;
}