プリントプロセッサをインストール
印刷プロセッサをインストールするには、インストール アプリケーションでスプーラーの 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;
}