当用户卸载应用程序时,我的应用程序会删除虚拟打印机。应用程序的安装和卸载可以使用用户交互(向导)或通过在 Windows server 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”帐户调用的。请帮忙。