Installation des virtuellen Druckeranschlussmonitors
Frage
Ich habe eine Port-Monitor-DLL, die ich durch Aufrufen der AddMonitor-Funktion des Spoolers installiere.Wenn ich diesen Monitor deinstallieren möchte, gibt die DeleteMonitor-Funktion den Fehlercode 3008 - "Der angegebene Druckmonitor wird derzeit verwendet" zurück.Wie kann ich meine Monitor-DLL freigeben?
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private class MONITOR_INFO_2
{
[MarshalAs(UnmanagedType.LPStr)]
public string pName;
[MarshalAs(UnmanagedType.LPStr)]
public string pEnvironment;
[MarshalAs(UnmanagedType.LPStr)]
public string pDLLName;
}
[DllImport("winspool.Drv", EntryPoint = "AddMonitorA", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool AddMonitor(
[MarshalAs(UnmanagedType.LPStr)] string Name,
Int32 Level,
[In, MarshalAs(UnmanagedType.LPStruct)] MONITOR_INFO_2 mi2);
[DllImport("winspool.Drv", EntryPoint = "DeleteMonitorA", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool DeleteMonitor(
[MarshalAs(UnmanagedType.LPStr)] string pNullServerName,
[MarshalAs(UnmanagedType.LPStr)] string pNullEnvironment,
[MarshalAs(UnmanagedType.LPStr)] string MonitorName);
private unsafe void InstallMonitor(string monitorName, string dllName)
{
MONITOR_INFO_2 mi2 = new MONITOR_INFO_2();
mi2.pName = monitorName;
mi2.pEnvironment = null;
mi2.pDLLName = dllName;
try
{
bool bRet = AddMonitor(null, 2, mi2);
if (!bRet)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
catch (Exception e)
{
if (!DeleteMonitor(null, null, monitorName))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
bRet = AddMonitor(null, 2, mi2);
if (!bRet)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
Lösung
Sie können einen Port Monitor nicht über den DeleteMonitor-Aufruf löschen, wenn derzeit ein oder mehrere Druckerobjekte einen Port dieses Typs verwenden.
Damit haben Sie mehrere Möglichkeiten:
- Tauschen Sie den Anschluss aller betroffenen Drucker gegen einen anderen Anschluss aus.(Am besten verwenden Sie so etwas wie LPT1: da es immer da ist).
- Löschen Sie alle Drucker über den Anschluss.
- Beenden Sie den Spooler-Dienst und entfernen Sie die entsprechenden Einträge aus der Registrierung (HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors). Starten Sie dann den Spooler neu.Dadurch bleiben die betroffenen Drucker dort, können jedoch nicht verwendet werden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow