◎WMI轻松入门之四——解析类定义

原创 2007年09月30日 08:48:00
在上一篇文章中我们说过,WMI中用类对托管资源进行抽象定义和和管理,那么,什么是类?
  类的定义相信在很多面向对象的计算机教材中都能找到,我的理解是:类,是包含了一组独立功能的模块,这个模块由数据和功能组成,其中数据叫做类的属性,完成功能的部分叫做类的方法。我认为类的优点是:类完全可以由张三进行设计,李四可以拿来直接使用,在使用的时候,李四不需要知道类是如何设计、如何实现的,只要知道:这个类可以实现什么样的功能,这个类包含有什么样的方法和属性就可以了。更加重要的是,类还可以进行继承,就像父亲亡故,儿子继承了父亲所有的财产一样,如果我们发现某个类A已经完成了我们需要的大部分功能,我们再去重新设计一个新类来完成我们所有的功能,未免费时费力,根据类可以继承的特性,我们只要声明一个类继承了类A,然后按照需要添加需要的新的数据元素、扩展现有的功能模块,相信工作会简单很多。我看到很多书里都在说代码重用,我不是程序员,不知道所谓的代码重用具体是如何实现的,但是相信类应该在其中起了很重要的作用。
  在微软的教程中,对类从功能和继承关系上进行了详细的说明,我不再赘述,仅仅做一个摘要:
  


  任何资源如果要求WMI进行托管,至少需要两个文件:提供程序和托管对象格式 (MOF) 文件。提供程序是一个中间件,通过调用托管资源的本地 API 来响应 WMI 请求。
  每一个WMI托管的硬件和软件资源均有一个类来定义,反过来说,一个CIM类就是一个WMI托管资源的模板,而且资源的所有实例都使用这个模板。这些模板是由属性、方法和限定符组成的。这些属性、方法和限定符都定义在MOF文件中。方法和属性是我们经常遇到的,那么什么是限定符呢?限定符是关于类、属性或方法类型的附加修饰符,类是静态的、抽象的、还是关联的,属性是只读的还是可写的,方法的返回参数等,都定义在其中,那么我们如何知道某个类有那些限定符呢?如下代码可以帮助我们方便的获得类的属性、方法和限定符的信息。

Code:
strComputer = "."
strNameSpace = "root/cimv2"
strClass=inputbox("请输入你要查询的类")

Set objClass = GetObject("winmgmts://" & strComputer & _
                           "/" & strNameSpace & ":" & strClass)

WScript.Echo strClass & " 的类限定信息如下:"
WScript.Echo "------------------------------"
i = 1
For Each objClassQualifier In objClass.Qualifiers_
      If VarType(objClassQualifier.Value) = (vbVariant + vbArray) Then    '常数 VBVariant 只与 VBArray 一起返回,以表明 VarType 函数的参数是一个 Variant 类型的数组。
          strQualifier = i & ". " & objClassQualifier.Name & " = " & _
                                    Join(objClassQualifier.Value, ",")
      Else
          strQualifier = i & ". " & objClassQualifier.Name & " = " & _
                                    objClassQualifier.Value
      End If
      WScript.Echo strQualifier
      strQualifier = ""
      i = i + 1
Next

WScript.Echo
WScript.Echo strClass & " 类的属性和属性限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassProperty In objClass.Properties_
      WScript.Echo i & ". " & objClassProperty.Name
      For Each objPropertyQualifier In objClassProperty.Qualifiers_
          If VarType(objPropertyQualifier.Value) = (vbVariant + vbArray) Then
              strQualifier = i & "." & j & ". " & _
                             objPropertyQualifier.Name & " = " & _
                             Join(objPropertyQualifier.Value, ",")
          Else
              strQualifier = i & "." & j & ". " & _
                             objPropertyQualifier.Name & " = " & _
                             objPropertyQualifier.Value
          End If
          WScript.Echo strQualifier
          strQualifier = ""
          j = j + 1
      Next
      WScript.Echo
      i = i + 1 : j = 1
Next

WScript.Echo
WScript.Echo strClass & " 类的方法和方法限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassMethod In objClass.Methods_
      WScript.Echo i & ". " & objClassMethod.Name
      For Each objMethodQualifier In objClassMethod.Qualifiers_
          If VarType(objMethodQualifier.Value) = (vbVariant + vbArray) Then
              strQualifier = i & "." & j & ". " & _
                             objMethodQualifier.Name & " = " & _
                             Join(objMethodQualifier.Value, ",")
          Else
              strQualifier = i & "." & j & ". " & _
                             objMethodQualifier.Name & " = " & _
                             objMethodQualifier.Value
          End If
          WScript.Echo strQualifier
          strQualifier = ""
          j = j + 1
      Next
      WScript.Echo
      i = i + 1 : j = 1
Next
如果我们执行上述代码来查找win32_service类的限定符,一般情况下可以得到如下信息:
win32_service 的类限定信息如下:
------------------------------
1. dynamic = True
2. Locale = 1033
3. provider = CIMWin32
4. SupportsUpdate = True
5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}

win32_service 类的属性和属性限定信息
------------------------------------------------------
1. AcceptPause
1.1. CIMTYPE = boolean
1.3. read = True
……
win32_service 类的方法和方法限定信息
-------------------------------------------------
1. StartService
1.1. MappingStrings = Win32API|Service Functions|StartService
1.2. Override = StartService
1.3. ValueMap = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,..
……
  返回的信息很多,我省略了其中的绝大部分,只保留了一部分典型的来说明我们应该如何读懂类的限定信息。
  返回信息的第一部分表明了对于此类的限定信息:
  1. dynamic = True    Abstract——抽象类,Dynamic——动态类,Association——关联类,表明win32_service类是动态类。
  2. Locale = 1033      代表着区域设置或者叫本地化编码,是一组与用户的语言、国家/地区以及文化传统有关的用户首选信息,确定诸如:键盘布局、字母的排序顺序,以及日期、时间、数字、货币等的格式,一般不用管它。
  3. provider = CIMWin32    Provider代表的是类的提供程序,说明win32_service类是由CimWin32.dll提供的。
  4. SupportsUpdate = True    指出类是否支持实例的修改。
  5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}    代表本地计算机上的全球通用唯一的标识符,我不知道有什么用处。
  
  返回信息的第二部分代表了类的属性限定符
  1. AcceptPause
  这第一行表明检索到的类的属性名是:AcceptPause
  1.1. CIMTYPE = boolean    CIMType代表属性的数据类型,说明这个属性是布尔型。
  1.3. read = True     read代表属性可读,而Write则代表属性的值是否可以修改,如果属性没有定义Write限定符,代表什么意思呢?它代表从该类获得的实例的那个属性是不可以改写的,也就是说不能给这个属性赋值。这其实解决了一个困惑我很久的一个问题,为什么我在对很多类的属性进行了赋值后,用Put_方法对修改进行了提交,可是事实上却什么也没有改变。此外还有Key限定符指出该属性是类的键,用于识别在相同资源集合中的托管资源的唯一实例。
  
  返回信息的第三部分代表了类的方法及方法的限定符。现在我们能用到的还不多,就不介绍了,有兴趣的朋友可以参照:http://msdn2.microsoft.com/en-us/library/aa393650.aspx
  需要说明的是,不是在每一个类定义或者属性、方法定义中,这所有的限定符都要出现的,可能只出现了其中的一部分。
  当然,我们也可以从system32/wbem/cimwin32.mof以及system32/wbem/cimwin32.mfl两个文件中读取整个托管资源的类定义和类描述,以及对每个类的属性、方法和限定符的描述,其中包含的信息很多,也包含了更多的类限定符,阅读起来有一定的难度。将上面的例子的代码和vbsedit中包含的Object Browser联合起来,可以得到我们需要的绝大部分的信息。

 

.net中的WMI编程(一):WMI介绍及简单应用

前言: 由于.net的某些特点使它脱离了操作系统底层,所以如果我们想获得一些底层的操作系统信息的时候比较困难,经常需要DllImport技术,这对一些对C/C++不熟悉的程序员来说简直是一个梦魇(对于...

WMI轻松入门

  • 2012年09月15日 21:53
  • 72KB
  • 下载

CWmi 类, WMI轻松用, 网关设置

#ifndef _WMI_H_#define _WMI_H_#define _WIN32_DCOM#include #include #pragma comment(lib, "wbemuuid.li...

Python轻松入门-37 自定义对象排序

视频教程下载链接:http://pan.baidu.com/s/1c1YHrdI 配套教程下载:http://pan.baidu.com/s/1qYdI6q4 这节课,我们来讲解自定义对象...

ArcGIS Engine10.0轻松入门级教程(4)——基本功能开发

1地图编辑功能   地图编辑功能涉及到比较复杂的地图与鼠标的交互以及事件的响应,ArcGIS提供了强大的地图编辑的相关功能。本节我们将尝试实现一些简单的地图编辑功能,包括点、线、面要素形状的创建...

ArcGIS Engine10.0轻松入门级教程(4)——基本功能开发

1地图编辑功能   地图编辑功能涉及到比较复杂的地图与鼠标的交互以及事件的响应,ArcGIS提供了强大的地图编辑的相关功能。本节我们将尝试实现一些简单的地图编辑功能,包括点、线、面要素形状的创建和移...

Activiti入门——轻松解读数据库

相关文章: 《史上最权威的Activiti框架学习》 《Activiti入门——环境搭建和核心API简介》 在Activiti中,相对前身JBPM基础上又额外多了5张,框架默认提供了23...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:◎WMI轻松入门之四——解析类定义
举报原因:
原因补充:

(最多只允许输入30个字)