动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.在Java应用程序中访问USB设备(1).
.Socket类.
.Struts教程-Struts的几个精细之.
.使用Java开发计算器(二).
.Tomcat 服务器Server.xml的关键参.
.深入探索CORBA对象生命周期之慨述.
.J2ME MIDP开发综合实例.
.JBuilder8新特性.
.j2ee性能调优之最小化资源压力测.
..Net中掌握Windows窗体间数据交互.
.在Spring中配置Hibernate的事务.
.在solairs上运行linux上的二进制.
.我眼中的Java经典书籍.
.常见的十四种Java开发工具及其特.
.体验流调试的威力.
.谈谈设计模式中的Iterator迭代器.
.企业内部网中使用Policy文件来设.
.Hibernate核心接口简介.
.使用Java Data Object(JDO)存放持.
.通过测试分类实现敏捷构建.

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

发表日期:2008-1-5 |



  避免使用 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 键可以添加一个新值。这些项对应于列表框的上下文菜单中的项。
  
 使用.NET框架类替代API调用的问题(图一)

  
图 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 类的所有有用方法。
  
  
 使用.NET框架类替代API调用的问题(图二)

  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 开发人员先前所拥有的功能更强大。
  
  提示:假如具有必要的权限,您还可以使用远程计算机上的注册表。您可以调用
上一篇:使用Web服务和Ja.NET来实现互用性 人气:464
下一篇:浅谈MDA技术未来发展方向 人气:600
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号