0

ユーザーがアプリケーションをアンインストールすると、アプリケーションは仮想プリンターを削除します。アプリケーションのインストールとアンインストールは、ユーザーインタラクション(ウィザード)を使用するか、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」アカウントを使用して呼び出されていることがわかりました。親切に助けてください。

4

2 に答える 2

0

システムの起動時に、PC で使用可能なプリンターのリストが作成される前に、グループ ポリシーがプリンターをアンインストールしようとしていることがわかりました (リストは以下のレジストリ キーの下に作成されます。リストが作成されていない場合、以下のキーは存在しません)。

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers"

したがって、openPrinter() を呼び出す前に 2 分間 (2 分以上) の遅延を追加しました。遅延の後、レジストリ キーが存在し、OpenPrinter() が成功しました。したがって、プリンターをアンインストールできます。

注: Microsoft は、サポートされている特定のハードウェアで Windows 8 の起動時間が 7 秒に短縮されたと主張しています。ただし、2 分間の遅延を挿入すると、Windows 8 PC の起動パフォーマンスが低下します。Windwos 8 OS の起動時間の改善に関する詳細については、以下のリンクを参照してください。 http://blogs.msdn.com/b/b8/archive/2012/05/22/designing-for-pcs-that-boot-faster-than-ever-before.aspx したがって、2 分の遅延は次のように処理できます。回避策。10/26 以降の Windows 8 OS リリースでの動作を確認する必要があります。

于 2012-10-26T11:53:54.937 に答える