Share via


인쇄 프로세서 설치

인쇄 프로세서를 설치하려면 설치 애플리케이션이 스풀러의 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 함수를 한 번 호출하므로 해당 드라이버를 사용하는 모든 프린터도 필요한 인쇄 프로세서를 사용할 수 있습니다. 다음 코드 예제에서는 이러한 점을 보여 줍니다.

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;
}