Installazione del monitor della porta della stampante virtuale
Domanda
Ho una dll di monitoraggio della porta, che installo chiamando la funzione AddMonitor dello spooler.Ma quando desidero disinstallare questo monitor, la funzione DeleteMonitor restituisce il codice di errore 3008 - "Il monitor di stampa specificato è attualmente in uso".Come posso liberare la dll del mio monitor?
[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());
}
}
Soluzione
Non sarà possibile eliminare un monitor di porta tramite la chiamata DeleteMonitor se uno o più oggetti stampante attualmente utilizzano una porta di quel tipo.
Questo ti lascia con diverse opzioni:
- Scambia la porta di tutte le stampanti interessate su un'altra porta.(Meglio usare qualcosa come LPT1: poiché è sempre presente).
- Elimina tutte le stampanti utilizzando la porta.
- Arresta il servizio spooler e rimuovi le voci appropriate dal registro (HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors), quindi riavvia lo spooler.Ciò lascerà lì le stampanti interessate ma saranno inutilizzabili.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow