日期:2012-08-16 浏览次数:20439 次
使用 .NET 框架类替代 API 调用 升级到 Microsoft .NET
Ken Getz
MCW Technologies
2002 年 2 月
摘要:通过学习 Microsoft .NET 框架中某些特定而有用的类,可以减少您对 Win32 API 调用的依赖。本文讨论的每个类都可以代替一个或多个 Win32 API 调用,而在 Microsoft Visual Basic 6.0 中,您必须调用一个或多个 Win32 API 才能完成相同的任务。
如果您是一位 Microsoft Visual Basic® 6.0 开发人员,您就无法避免调用 Win32 API。开发人员有太多的任务需要完成,而 Visual Basic 却不能提供任何实现方法。例如,在 Visual Basic 6.0 中,您很难完成以下任务:
如果仅使用 Visual Basic 6.0 中提供的工具,您不可能解决上述任何问题。对于每个问题,开发人员都需要使用 Windows API。许多开发人员使用 Windows API 已经找到了完成这些(以及许多其他)任务的方法。
为什么不继续在 .NET 环境中使用 Windows API 呢?如果使用 .NET 平台调用服务(称为“P/Invoke”),您当然可以这样做。从 Visual Basic 开发人员的角度来说,调用 Windows API 并不比使用他们所熟悉的 Declare 语句困难。不过,在 .NET 环境中使用 Windows API 存在一些比较严重的缺陷,您可能需要考虑采取任何可行的措施来避免这些问题。例如:
这个问题很简单:尽管您可以在 Visual Basic .NET 应用程序中继续使用 Windows API,但通常情况下,您应当尽可能寻找由 .NET 框架提供的替代品。虽然 .NET 框架的目的并不是要阻止您直接使用 Windows 的功能,但框架的确提供了大量的类,可以帮助您放弃对 Windows API 调用的依赖。
如果能够给出一个完整列表,列出 Win32 API 调用以及在 .NET 框架中完成相同任务的相应方法(如果有),可能会很方便,不过本文不涉及此任务。在本文中,您将了解到一些由 .NET 框架提供的特定且非常有用的类,它们可以解决您的问题。在每个示例中,本文所讨论的类都可以用来替代一个或多个 Win32 API 调用,而在 Microsoft Visual Basic 6.0 中,您必须调用一个或多个 Win32 API 才能完成相同的任务。
如果您与大多数 Visual Basic 6.0 开发人员一样,您会发现 Microsoft Visual Basic for Applications (VBA) 中内置的 SaveSetting、GetSetting、GetAllSettings 和 DeleteSetting 方法有点儿用处,但却很可能被它们的局限性弄得精疲力尽。所有这些方法都只能在注册表的 HKEY_CURRENT_USER\Software\VB 和 VBA Program Settings 下的项中使用。如果您要在注册表的其他地方读取或写入注册表项或注册表值,则必须使用复杂的 API 调用,或依靠别人的代码来处理此问题。
.NET 框架在 Microsoft.Win32 名称空间中提供了一对功能强大的类(Registry 和 RegistryKey),从而简化了注册表的使用,即不再需要 API 调用!
作为演示,请在示例项目的主窗体上单击 Work with the Registry(使用注册表)按钮。此窗体提供了 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 项的 HKEY_LOCAL_MACHINE 配置单元中所有注册表值的列表。您可以右键单击列表中的任何项,然后选择插入新项,或者编辑或删除选定项,如图 1 所示。
提示:示例窗体也已经过设计,在列表框中按下 Enter 键时,可以编辑当前选定的项。按下 Delete 键可以删除选定项,按下 Insert 键可以添加一个新值。这些项对应于列表框的上下文菜单中的项。
图 1:使用 Registry 和 RegistryKey 类轻松检索和修改 Windows 注册表中的信息
.NET 框架提供了两个非常有用的类,使您可以轻松使用 Windows 注册表。第一个类是 Registry,它提供的字段与标准 Registry 配置单元的各字段相对应:
要使用 Registry 类,只需检索所需配置单元的引用。示例窗体的 LoadList 过程中包含如下代码,以便使用注册表中的 HKEY_LOCAL_MACHINE 配置单元:
Imports Microsoft.Win32Dim reg As RegistryKey = Registry.LocalMachine
另一个类是 RegistryKey,它可以完成所有工作。它提供了一组使用 Registry 的方法。表 1 列出了 RegistryKey 类的所有有用方法。
表 1:R