【问题标题】:How to use Win32 classes like Win32_Printer?如何使用 Win32_Printer 等 Win32 类?
【发布时间】:2012-12-20 06:00:21
【问题描述】:

我必须在 C#.net 中使用诸如 Win32_PrintJobWin32_Printer 等 Win32 类。

我没有得到应该导入哪个命名空间以在我的 c#.net 应用程序中使用 Win32 类?

【问题讨论】:

    标签: c# winapi wmi


    【解决方案1】:

    这些是 WMI 类,因此您需要使用 System.Management 命名空间。

    这是一篇关于打印机的精彩文章:Managing Printers Programatically using C# and WMI

    【讨论】:

      【解决方案2】:

      为了从 C#(或 .Net)访问 WMI,您必须导入 System.Management 命名空间。此外,如果您是使用 WMI 的新手,请尝试使用 WMI Delphi Code Creator 之类的工具,它可以帮助您创建 C# sn-p 来访问 WMI。

      试试这个工具创建的示例代码。

      using System;
      using System.Collections.Generic;
      using System.Management;
      using System.Text;
      
      namespace GetWMI_Info
      {
          class Program
          {
      
              static void Main(string[] args)
              {
                  try
                  {
                      string ComputerName = "localhost";
                      ManagementScope Scope;                
      
                      if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
                      {
                          ConnectionOptions Conn = new ConnectionOptions();
                          Conn.Username  = "";
                          Conn.Password  = "";
                          Conn.Authority = "ntlmdomain:DOMAIN";
                          Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
                      }
                      else
                          Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
      
                      Scope.Connect();
                      ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_PrintJob");
                      ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
      
                      foreach (ManagementObject WmiObject in Searcher.Get())
                      {
                          Console.WriteLine("{0,-35} {1,-40}","Document",WmiObject["Document"]);// String
                          Console.WriteLine("{0,-35} {1,-40}","Name",WmiObject["Name"]);// String
      
                      }
                  }
                  catch (Exception e)
                  {
                      Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
                  }
                  Console.WriteLine("Press Enter to exit");
                  Console.Read();
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        虽然您尚未标记答案,但您可能正在寻找其他答案,为您提供 .NET 框架命名空间 System.Management

        但是,您可能一直在阅读 WMI 文档并且您是从这个角度来的。 WMI 命名空间 是基本概念之一,它当然与 .NET 命名空间完全不同。所以这里有一个完全不同的答案,以防万一......


        您可能需要的#1 WMI 命名空间是root\cimv2。只有在深入挖掘时,您才可以使用root\subscription 或某个公司选择的命名空间,该公司决定将自己的 WMI 提供程序放在“特殊”的地方。

        通常,当您要连接到 WMI 命名空间时,它位于计算机名称之后,例如\\<computer>\root\cimv2。在本地连接时,可以省略计算机,因此您只需放置名称空间路径,例如root\cimv2

        在 .NET 中,您可以通过在字符串中使用 WMI 命名空间来构建 ManagementPath,或者在传递给 ManagementScope 构造函数的字符串中隐式使用它来指定 WMI 命名空间。

        【讨论】:

          【解决方案4】:

          在 .NET 中确实实现了此类对象,因此您不需要使用这些对象。
          如果您必须直接使用 winapi,您可以创建一个包含 winapi 结构中包含的所有内容的结构(它们是结构,而不是类)。

          一些注意事项:
          保持所有成员的确切顺序和类型。
          System.IntPtr表示句柄(如HWND等)。
          如果需要传递结构体的大小,请使用Marshal.SizeOf()
          您还可以添加[StructLayout] 属性,您可以在其中指定字符集和其他重要属性。
          命名空间System.Runtime.InteropServices 有一些常见的winapi 结构。

          【讨论】:

          • +0 合理,但对相对范围问题的通用回答。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          相关资源
          最近更新 更多