Pregunta

Tengo un DLL de monitor de puerto, que instalé por la función AddMonitor de llamada de la cola.Pero cuando quiero un desinstalación, este monitor, la función de aletemonitore devuelve el código de error 3008: "El monitor de impresión especificado está actualmente en uso".¿Cómo puedo liberar mi monitor DLL?



    [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());
        }
    }

¿Fue útil?

Solución

Esto te deja con varias opciones:

  • Cambie el puerto de todas las impresoras afectadas a otro puerto.(Es mejor usar algo como LPT1: ya que siempre está ahí).
  • Elimine todas las impresoras que utilizan el puerto.
  • Detenga el servicio de cola de impresión y elimine las entradas correspondientes del registro (HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors) y luego reinicie la cola de impresión.Esto dejará las impresoras afectadas allí pero no se podrán utilizar.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top