代码之家  ›  专栏  ›  技术社区  ›  jp2code

win32_打印机管理对象搜索器错误(vs2008 c)

  •  0
  • jp2code  · 技术社区  · 15 年前

    首先,此代码在VS2005中起作用。

    每当我尝试跨过foreach循环并分配ManagementObject时,VS2008中的代码就会崩溃,并出现未经授权的AccessException。

    public static List<string> GetPrintersCollection() {
      if (printers == null) {
        printers = new List<string>();
        string searchQuery = "SELECT * FROM Win32_Printer";
        try {
          using (ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery)) {
            ManagementObjectCollection Printers = searchPrinters.Get(); // <= Printers data below
            foreach (ManagementObject printer in Printers) { // <= Error Here
              printers.Add(printer.Properties["Name"].Value.ToString());
            }
          }
        } catch (UnauthorizedAccessException err) {
          Console.WriteLine(err.Message); // the message is an empty string
          throw new Exception("PrinterSpool - GetPrintersCollection: You do not have authorization to access this printer.");
        } catch (Exception err) {
          throw new Exception(string.Format("PrinterSpool - GetPrintersCollection: {0}", err.Message));
        }
      }
      return printers;
    }
    

    堆栈跟踪
    在System.Runtime.InteropServices.Marshal.ThrowExceptionForHrInternal(Int32错误代码,Intptr错误信息)
    在System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()上
    在acpclasses.printerspool.getprintersCollection()上…

    当我试图在本地窗口中查看数据时,这些字段看起来很可疑:
    1。count-value:“函数计算超时。”
    2。issynchronized-value:函数计算已禁用,因为上一个函数计算超时。
    三。syncroot-value:函数计算已禁用,因为上一个函数计算超时。

    我该如何进一步调试它以了解发生了什么?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Austin Salonen    15 年前

    要进一步调试,需要检查 Printers 在进入foreach循环之前。

    1. 在上放置断点 searchPrinters.Get() 线。
    2. 按F10
    3. 现在检查你的物品。

    另一件有帮助的事情是改变 err.Message err.ToString() .

    值得一提的是,我在XP上运行2005和2008时都没有遇到任何问题。

    编辑 :要尝试的发布代码。

    public static List<string> GetPrintersCollection()
    {
        if (printers == null)
        {
            printers = new List<string>();
            string searchQuery = "SELECT * FROM Win32_Printer";
            try
            {
                using (ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery))
                {
                    ManagementObjectCollection Printers = searchPrinters.Get(); // <= Printers data below
                    foreach (ManagementObject printer in Printers)
                    {
                        printers.Add(printer.Properties["Name"].Value.ToString());
                    }
                }
            }
            catch (UnauthorizedAccessException err)
            {
                //Log & re-throw
                Console.WriteLine("Caught UnauthorizedAccessException:  " + err.ToString()); 
                throw;  //re-throw existing exception, not a new one
            }
            //there's no reason to catch the plain-old Exception 
        }
    
        return printers;
    }
    

    编辑 :我唯一能想到的是手动检查 打印机和传真 看看有没有给你带来问题。

        2
  •  1
  •   Matej Breznik    13 年前

    试试这个

           `string strQuery = "SELECT * FROM Win32_Printer";
    
            ObjectQuery objectQuery = new ObjectQuery(strQuery);
    
            ManagementObjectSearcher query = new ManagementObjectSearcher(objectQuery);
            query.Options.Timeout=new TimeSpan(0,0,5);
            ManagementObjectCollection queryCollection = query.Get();
    
                foreach (ManagementObject managementObject in queryCollection)
                {....}`
    

    超时的默认值必须是TimeSpan.MaxValue,但…

    在我的情况下,这是一个解决办法。