2012-02-22 3 views
1

У меня есть DLL монитора порта, который я устанавливаю по вызову функции AddMonitor диспетчера очереди печати. Но когда мне нужен uninstal этот монитор, функция DeleteMonitor возвращает код ошибки 3008 - «Указанный монитор печати в настоящее время используется». Как я могу освободить 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()); 
     } 
    } 

ответ

0

Вы не сможете удалить Port Monitor с помощью вызова DeleteMonitor, если есть один или несколько объектов принтера в настоящее время используют порт этого типа.

Это оставляет вас с несколькими вариантами:

  • Своп порт всех пострадавших принтеров к другому порту. (Лучше всего использовать что-то вроде LPT1: поскольку он всегда там).
  • Удалите все принтеры, используя порт.
  • Остановите службу буферизации и удалите соответствующие записи из реестра (HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors), затем перезапустите спулер. Это оставит поврежденные принтеры там, но они будут непригодными для использования.
Смежные вопросы