分享
 
 
 

使用.NET框架类替代API调用的问题

王朝c#·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

避免使用 Win32 API

假如您是一位 Microsoft Visual Basic® 6.0 开发人员,您就无法避免调用 Win32 API。开发人员有太多的任务需要完成,而 Visual Basic 却不能提供任何实现方法。例如,在 Visual Basic 6.0 中,您很难完成以下任务:

确定文件版本信息

在注册表的任何位置进行读取和写入操作。

确定用户的特定文件夹,例如 Microsoft Windows® 收藏夹或个人文件夹。

检索所有可用驱动器的列表。

查找用户的登录名或计算机名。

检索所有打开窗口的列表。

假如仅使用 Visual Basic 6.0 中提供的工具,您不可能解决上述任何问题。对于每个问题,开发人员都需要使用 Windows API。许多开发人员使用 Windows API 已经找到了完成这些(以及许多其他)任务的方法。

Windows API 存在什么问题?

为什么不继续在 .NET 环境中使用 Windows API 呢?假如使用 .NET 平台调用服务(称为“P/Invoke”),您当然可以这样做。从 Visual Basic 开发人员的角度来说,调用 Windows API 并不比使用他们所熟悉的 Declare 语句困难。不过,在 .NET 环境中使用 Windows API 存在一些比较严重的缺陷,您可能需要考虑采取任何可行的措施来避免这些问题。例如:

.NET 公共语言运行时不会受平台影响。当您使用 Windows API 调用时,您将代码绑定到编写代码的特定平台上(即,相对于其他操作系统的某个特定 Windows 版本或 Windows 本身)。必要时,您需要将代码转换到另一个平台上,而这样做就需要修改使用 API 调用的每行代码。

从 .NET 中调用 Windows API(或 DLL 中的任何非托管代码)不像在 Visual Basic 6.0 中那样简单。例如,对结构的工作方式的限制使得很难将结构传递给 API 调用。此外,由于数据类型的更改以及更严格的类型转换,Visual Basic 6.0 的 API 声明也需要进行更改。

根据语言的不同,使用 Windows API(以及通常情况下使用的外部代码)的技巧也不尽相同。假如您打算在多 .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 配置单元的各字段相对应:

ClassesRoot (HKEY_CLASSES_ROOT)

CurrentConfig (HKEY_CURRENT_CONFIG)

CurrentUser (HKEY_CURRENT_USER)

DynData (HKEY_DYN_DATA)

LocalMachine (HKEY_LOCAL_MACHINE)

PerformanceData (HKEY_PERFORMANCE_DATA)

Users (HKEY_USERS)

要使用 Registry 类,只需检索所需配置单元的引用。示例窗体的 LoadList 过程中包含如下代码,以便使用注册表中的 HKEY_LOCAL_MACHINE 配置单元:

Imports Microsoft.Win32

Dim reg As RegistryKey = Registry.LocalMachine

另一个类是 RegistryKey,它可以完成所有工作。它提供了一组使用 Registry 的方法。表 1 列出了 RegistryKey 类的所有有用方法。

RegistryKey 类还提供以下三个属性:

Name:检索项的名称。

SubkeyCount:检索与该项相关联的子项的数量。

ValueCount:检索与该项相关联的项值的数量。

示例窗体的 ListLoad 过程将检索所请求项中的所有值,并将检索到的值添加到窗体的列表框中:

Private Const conRegKey As String = _

"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

Private StrUCture RegData

Public Value As String

Public Data As String

Public Overrides _

Function ToString() As String

Return Me.Value

End Function

End Structure

Private Sub ListLoad()

Dim reg As RegistryKey = Registry.LocalMachine

Dim astrValues() As String

Dim strValue As String

Dim rd As RegData

' 清除列表框中的现有项。

lstItems.BeginUpdate()

lstItems.Items.Clear()

' 打开注册表项,然后使用

' 该项的值加载列表框。

reg = reg.OpenSubKey(conRegKey)

astrValues = reg.GetValueNames()

For Each strValue In astrValues

rd.Value = strValue.ToString

rd.Data = reg.GetValue(strValue)

lstItems.Items.Add(rd)

Next

lstItems.EndUpdate()

End Sub

要编辑示例窗体中的值或添加新值,需要运行以下代码:

Private Sub AddOrEdit( _

ByVal rd As RegData, _

ByVal Mode As frmAddValue.accessMode)

Dim reg As RegistryKey = Registry.LocalMachine

Dim frm As New frmAddValue(Mode)

frm.KeyName = rd.Value

frm.KeyData = rd.Data

If frm.ShowDialog() = DialogResult.OK Then

If frm.KeyName String.Empty Then

reg = reg.OpenSubKey(conRegKey, True)

reg.SetValue(frm.KeyName, frm.KeyData)

ListLoad()

End If

End If

End Sub

此代码将再次打开注册表项,这次将请求写入项值的权限(此请求由 OpenSubKey 的第二个参数发出)。然后,代码将调用 SetValue 方法,传递图 1 所示的对话框窗体中的项名和项值。为简化工作,可以使用 SetValue 方法添加新值或修改现有值。假如项值不存在,SetValue 方法将添加一个项值。

要删除项值,示例窗体将调用以下代码:

Private Sub DeleteKey(ByVal rd As RegData)

Dim strText As String

Dim reg As RegistryKey = Registry.LocalMachine

If lstItems.SelectedIndex = -1 Then

Exit Sub

End If

' 删除选定的项。

strText = String.Format( _

"Are you sure you want to delete ""{0}""?", _

rd.Value)

If MessageBox.Show(strText, _

"Delete Registry Value", _

MessageBoxButtons.YesNo, _

MessageBoxIcon.Question) = DialogResult.Yes Then

' 打开项,答应写入。

reg = reg.OpenSubKey(conRegKey, True)

reg.DeleteValue(rd.Value)

' 重新加载列表框。

ListLoad()

End If

End Sub

此代码将打开项并请求对其执行写入操作,然后将调用 DeleteValue 方法删除选定的值。

有了示例窗体提供的信息和 .NET 框架附带的文档,便可以轻松地完成与注册表相关的任何任务,而不必使用 Windows API。这是一个简单的对象模型,但它提供的功能比 Visual Basic 6.0 开发人员先前所拥有的功能更强大。

提示:假如具有必要的权限,您还可以使用远程计算机上的注册表。您可以调用

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有