ユーザーがアプリケーションをアンインストールすると、アプリケーションは仮想プリンターを削除します。アプリケーションのインストールとアンインストールは、ユーザーインタラクション(ウィザード)を使用するか、Windowsサーバー2003でグループポリシーを設定することで実行できます(ドメイン管理者はサーバーでポリシーを設定し、クライアントPCのドメインユーザーはグループポリシーを更新して、インストールのためにクライアントPCを再起動する必要がありますまたはアプリケーションのアンインストール)。アプリケーションの次のコードは、アプリケーションをアンインストールするときにプリンターとプリンタードライバーを削除します。
void CPrinterDriver::DeletePrinterIfExists()
{
// Delete old printer driver if existing
ControlSpoolService(TRUE);
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS pDefaults = { NULL, NULL, PRINTER_ALL_ACCESS };
// Ignore error codes
OpenPrinter(m_driverInfo.pName, &hPrinter, &pDefaults);
if (hPrinter)
{
// deleting jobs
SetPrinter(hPrinter, 0, NULL, PRINTER_CONTROL_PURGE);
// Delete printer
DeletePrinter(hPrinter);
// Get printer driver name and delete it
DWORD dwNeeded = 0;
GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
if (dwNeeded)
{
PRINTER_INFO_2 *pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, sizeof(PRINTER_INFO_2)*dwNeeded);
if (pi2)
{
GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
DeletePrinterDriver(NULL, NULL, pi2->pDriverName);
GlobalFree(pi2);
}
}
ClosePrinter(hPrinter);
}
}
上記のコードは、Windows 7で、アンインストールの両方の場合(ユーザーによる対話型インストールとグループポリシーの使用)でうまく機能します。Windows 8では、ユーザーによる対話型のインストールとアンインストールを使用するとうまく機能します。しかし、Windows 8では、上記のOpenPrinter()はERROR_INVALID_PRINTER_NAMEを取得しています。
OpenPrinter()が「SYSTEM」アカウントを使用して呼び出されていることがわかりました。親切に助けてください。