欢迎光临
我们一直在努力

使用 .NET 框架类替代 API 调用 (二)-.NET教程,.NET Framework

建站超值云服务器,限时71元/月

使用 system.environment 类

system.environment 类提供了若干不同的信息,如果没有这些信息,就需要进行多次 windows api 调用。使用 system.environment 可以检索:

  • 有关可用驱动器的信息(getlogicaldrives 方法)
  • windows 启动后的毫秒数(tickcount 属性)
  • 一般环境设置(由 currentdirectory、machinename、osversion、systemdirectory、userdomainname、userinteractive、username 和 workingset 属性提供)
  • 特定文件夹列表(使用 getfolderpath 方法提供)

如果您使用过 windows api,您将知道选择方法和属性将代替很多 api 调用,包括 gettickcount、getlogicaldrives、getsystemdirectory、getcomputername、getusername 以及 getversionex 等等。
在图 4(单击主窗体上的 environment info [环境信息])所示的示例窗体中,在靠近顶部的列表框中显示了执行 getlogicaldrives 方法的结果,其中包括所有特定文件夹的列表(使用 getfolderpath 方法检索)。在窗体下部的列表框中,显示了该类的许多属性的运行结果。
使用 .NET 框架类替代 API 调用 (二)-.NET教程,.NET Framework
图 4:显示 system.environment 类所使用的属性和方法的窗体
另外,要测试 tickcount 属性,请单击 test clickcount(测试 clickcount),以显示使用示例窗体中定义的 stopwatch 类的结果,并请使用以下代码:

public class stopwatch    private mintstart as integer    public sub start()        mintstart = environment.tickcount    end sub    public function elapsed() as integer        return environment.tickcount - mintstart    end function    public overrides function tostring() as string        return string.format( _         "started: {0}, elapsed: {1}", _         mintstart, me.elapsed)    end functionend class

此处显示的 fillproperties 方法使用先前显示过的 additem 方法的一个副本,将属性名称和结果填入 listview 控件,如下所示:

private sub fillproperties()    additem("currentdirectory", _     environment.currentdirectory)    additem("machinename", environment.machinename)    additem("osversion.platform", _     environment.osversion.platform.tostring)    additem("osversion.version", _     environment.osversion.version.tostring)    additem("systemdirectory", _     environment.systemdirectory)    additem("userdomainname", environment.userdomainname)    additem("userinteractive", _     environment.userinteractive)    additem("username", environment.username)    additem("workingset", environment.workingset)end sub

除了使用 environment 类之外,fillfolderlist 实际上还包含一些有趣的代码。这个过程的目的是循环使用 environment 类提供的 specialfolder 枚举中的所有成员。(此枚举包含物理文件夹 [如收藏夹和历史记录等] 的逻辑名称。)该过程将每个枚举值的名称添加到窗体上的 listview 控件中,同时将传递枚举值的结果添加到 environment 对象的 getfolderpath 方法中。下面所示的过程能够完成所有工作:

private sub fillfolderlist()    dim strname as string    dim astrnames() as string    dim aintvalues as array    dim i as integer     使用 specialfolder 枚举中的名称     填写 listview 控件的第一列。    astrnames = system.enum.getnames( _     gettype(environment.specialfolder))    aintvalues = system.enum.getvalues( _     gettype(environment.specialfolder))    for i = 0 to astrnames.length - 1        with lvwfolders.items.add(astrnames(i))            .subitems.add( _             environment.getfolderpath(aintvalues(i)))        end with    nextend sub

此示例没有对发送到 environment 对象的参数进行硬编码,而是使用了 enum 类的共享 getnames 和 getvalues 方法。通过将调用 visual basic .net gettype 函数的结果传递给 getnames(传递指定的枚举类型),您可以检索使用所有枚举成员的名称填写的数组。重复包含 getvalues 方法的过程将返回一个 array 对象,其中包含所有枚举值。

astrnames = system.enum.getnames( _ gettype(environment.specialfolder))aintvalues = system.enum.getvalues( _ gettype(environment.specialfolder))

给出这两个数组后,程序的其余部分将在这两个数组中循环运行,将 astrnames 中的值添加到 listview,然后调用 environment 类的 getfolderpath 方法来检索相应的路径:

for i = 0 to astrnames.length - 1    with lvwfolders.items.add(astrnames(i))        .subitems.add( _         environment.getfolderpath(aintvalues(i)))    end withnext

图 4 中的上部 listview 控件包含这些代码的输出内容。

提示:enum 为您提供了一些 visual basic 6.0 中没有的技巧,例如示例中所示的 getnames 和 getvalues 方法。有关利用 enum 类的功能的详细信息,请参阅 .net 框架文档。

使用 windows.forms.systeminformation 类

在提供精心设计的用户界面时,您常常需要确定当前的 windows 设置,例如图标的高度和宽度,或者滚动条的宽度。在 visual basic 6.0 中,您可以使用 getsystemmetrics 和 systemparametersinfo windows api 函数来确定许多此类设置。在 .net 框架中,您可以使用 windows.forms 名称空间提供的 systeminformation 类。
尽管图 5 中 frmsysteminformation 使用的代码不是很有趣,但它确实显示了该类提供的所有属性。(单击主窗体上的 systeminformation info [系统信息] 可以测试此示例窗体。)示例窗体对 systeminformation 类的所有属性进行操作,将每个属性的名称和当前值显示在窗体的 listview 控件中。
使用 .NET 框架类替代 API 调用 (二)-.NET教程,.NET Framework
图 5:显示 windows.forms.systeminformation 类的所有属性的示例窗体
示例窗体使用了前面介绍过的 additem 方法,在 systeminformation 类所有 60 多个属性中简单地循环运行并显示输出内容:

additem("arrangedirection", _ systeminformation.arrangedirection)additem("startingposition", _ systeminformation.arrangestartingposition)additem("bootmode", systeminformation.bootmode) 等等...

总结

  • 虽然您可以使用 visual basic .net 中的平台调用服务 (p/invoke) 来处理非托管代码,然后直接调用 windows api,但在创建 visual basic .net 应用程序时,您还是应该寻找其他替代方法。不过,您不用担心 p/invoke 的细节问题,因为 declare 语句会为您处理这些细节。
  • .net 框架并不封装所有的 windows api 功能,但是您在 visual basic 6.0 中可能要使用 api 调用才能实现的操作在 .net 框架中也可以实现。
  • registry 和 registrykey 类简化了对 windows 注册表的操作,可以帮助开发人员避免大量的 api 调用。
  • filedialog、colordialog、fontdialog 和 printerdialog 类使您可以很方便地使用 windows 中的常用对话框。您不需要直接调用 windows api,也不需要使用可怕的 commondialog activex 控件。
  • 您可以使用 fileversioninfo 类检索内置在可执行文件、驱动程序文件和 dll 文件中的所有文件版本信息。此类可以替代 visual basic 6.0 中所需的某些复杂的 windows api 代码。
  • environment 和 systeminformation 类使您可以方便地检索系统设置,如果没有这些类,则需要调用许多不同的 api 函数。

关于作者

ken getz 是 mcw technologies 的资深顾问,他的工作涉及编程、著书和培训。他精通用 microsoft access、visual basic 以及 office 和 backoffice 套件编写的工具和应用程序。ken 还与其他人一起编写了许多书籍,包括:与 paul litwin 和 mike gilbert 合著的《access 97 developers handbook》;与 paul litwin 和 mike gilbert 合著的《access 2000 developers handbooks》;与 paul litwin 和 mike gunderloy 合著的《access 2002 developers handbooks》;与 mike gilbert 合著的《visual basic language developers handbook》;以及与 mike gilbert (sybex) 合著的《vba developers handbook》。他还参与了 appdev 培训资料的编写工作,并从事这方面的教学工作。ken 经常在技术会议上发言,自 1994 年以来,每一届的 microsoft tech*ed 会议上他都会发表演讲。ken 是 access/vb/sql advisor 杂志的技术编辑和 informant communication group 属下的《microsoft office solutions》杂志的电子文档撰稿人。

关于 informant communications group

informant communications group, inc. (www.informant.com) 是一家专注于信息技术行业的多媒体公司。icg 成立于 1990 年,致力于与软件开发有关的出版物、会议、目录发布和 web 站点等领域。icg 在美国和英国均设有办事处,目前已成为享有盛誉的媒体和营销内容集成商,并以高质量的技术信息满足 it 人员不断增长的需求。
© 2002 informant communications group 和 microsoft corporation 版权所有。
技术编辑:kng consulting

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 使用 .NET 框架类替代 API 调用 (二)-.NET教程,.NET Framework
分享到: 更多 (0)