vb.net编程中调用Window AP函数

转载 2007年09月18日 16:22:00
 Windows API就是Windows系统的API函数简称(Application Program Interface,即:应用程序接口函数),它是Windows操作系统提供给各种开发基于Windows平台应用软件的开发语言的一些公用的函数,这些函数一般都比较底层,所以当各种开发语言使用自带的函数或类库已无法解决问题时,调用Windows API函数往往是一种非常直接、有效的解决方法。但由于在程序中调用Windows API函数一般都很复杂,所以对于程序员来说,是否能够灵活的使用Windows API函数,往往也是其水平高低的一个重要标志。但自从微软推出.Net框架以后,各种开发基于.Net平台下的程序语言,如Visual Basic .Net、Visual C#等却很少使用Windows API函数,并且微软公司也不像以前那样,提倡在这些.Net开发语言中使用
  
  Windows API函数,其主要的原因如下:

  1. Net框架所附带的类库.Net FrameWork SDK是一个内容丰富、功能强大的软件开发包,各种Windows API函数所实现的各种功能几乎都可以在这个软件开发包中找到与之对应的部分。
  
  2.微软Visual Basic .Net、Visual C#等目的是编写跨平台的应用程序,如果在Visual Basic .Net、Visual C#等中使用Windows API函数,这也就注定了编写出的程序只能运行于Windows平台之下,而弱化了.NET的跨平台能力。这也就是为什么微软不提倡在.Net平台调用Windows API函数的原因。
  
  虽然微软并不提倡在Visual Basic .Net、Visual C#中调用Windows API函数,但由于目前.Net 框架推出时间较短,.Net FrameWork SDK中提供的类库还并不足以完全替换Windows API函数的所有功能,所以在某些时候,.Net开发语言还是必须要调用Windows API函数。
  
  一.平台调用、托管DLL、非托管DLL简介:
  托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为“DLL”的文件。具体所指就是封装各种命名空间所在的DLL文件,如System.dll等。非托管DLL就是平常所的动态链接库等,其中就包括了封装所有Windows API函数的DLL文件。各种非托管DLL中的函数在公共语言运行库中不能直接被调用,而需要经过.Net框架提供的“平台调用”服务后才可以。
  
  “平台调用”是.Net框架为Visual Basic .Net、Visual C#等.Net开发语言提供的一种服务,用以在托管代码中引入各种非托管DLL中封装的函数(其中包括Windows API函数)。“平台调用”依赖于元数据在运行时查找导出函数并封装其参数。图01公共语言运行库利用“平台服务”调用非托管DLL中的函数的流程图:
  

图01:“平台服务”的调用非托管函数的流程图


  在托管代码中使用“平台调用”服务调用非托管DLL中封装的函数时,“平台服务”将依次执行以下操作:
  
  1.查找包含该函数所在的DLL文件。
  
  2.如果找到,则将该DLL文件 加载到内存中。
  
  3.查找函数在内存中的地址并将其参数推到堆栈上,并封送所需的数据。
  
  4.将控制权转移给非托管函数。 这样整个函数调用完成。
  
  在Visual Basic .Net中使用“平台调用”服务,申明Windows API函数主要有二种具体的实现方法:
  
  1.使用DllImport特征类来申明Windows API函数。
  
  2.使用“Declare”语句来申明Windows API函数。
  
  这二种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明Windows API函数时出错,所以并不提倡。而第二种方法相对简单,并且又保存了以前Visual Basic中的很多语法,所以在平常时大都使用这种方法来申明Windows API函数。
  
  二.vb.net查看文件中图标的函数及申明Windows API的方法:
  Visual Basic .Net要实现查看文件中的图标,目前只使用.Net FrameWork SDK是无法实现这种功能的,正如前面所说,主要是由于.Net FrameWork SDK推出的时间较短,其功能还不可能面面俱到。解决问题的关键是正确使用Windows API函数,其中所涉及到的Windows API函数主要有二个:其一是获得指定文件中的图标数目;其二是从指定文件的指定位置导出图标的Windows句柄。这二个函数都位于“Shell32.dll”文件中,并且函数的入口点都为“ExtractIcon”。下面是在Visual Basic .Net中分别使用DllImport特征类和“Declare”语句申明这二个Windows API函数的具体方法。
  
  (1).使用DllImport特征类来申明Windows API函数:
  
  下面是在Visual Basic .Net中使用DllImport特征类申明二个Windows API函数的具体示例:
  
  '函数ExtractIcon,其功能是是从指定文件的指定位置导出图标的Windows句柄。
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function

  '函数Icon_Num,其功能是获得指定文件中的图标数目
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
Icon_Num ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
End Function

  
  在使用DllImport特征类申明Windows API函数时,如果申明的函数名称和函数的入口点相同,则可以在申明Windows API函数时,省略定义函数入口点对应的代码,即EntryPoint对象字段对应的代码,这样声明ExtractIcon函数的代码也可以简化为如下所示:
  
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function

  
  (2).使用“Declare”语句来申明Windows API函数:
  
  使用“Declare”语句的确比使用DllImport特征类要简单了许多,下面是在Visual Basic .Net中使用“Declare”语句来声明上述二个Windows API函数的具体方法:
  
  
Declare Auto Function ExtractIcon Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
'声明ExtractIcon函数

  
Declare Auto Function Icon_Num Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
'声明Icon_Num函数

  
  在Visual Basic .Net中声明Windows API函数时,“Declare”语句中Alias关键字的作用相当于使用DllImport特征类中的EntryPoint对象字段。同样在使用“Declare”语句声明Windows API函数时,如果声明的函数和函数的入口点相同,也可以省略Alias关键字对应的代码,所以ExtractIcon函数也可以简化为如下:
  
  
Declare Auto Function ExtractIcon Lib "Shell32.dll" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
  
  下面就结合一个示例的编写过程来掌握的这二个Windows API函数的具体使用方法,这个示例的作用就是读取指定文件中的图标数目,并显示文件中的图标。
  
  三.本文中程序的编写、调试和运行环境:
  (1).视窗2000高级服务器版。
  
  (2).Visual Studio .Net 2003企业结构设计版,.Net FrameWork SDK版本号4322。
  
  四.Visual Basic .Net读取文件中的图标的实现步骤:
  下面介绍的示例,其功能读取指定文件中包含的图标数目,并把这些图标全部显示出来。下面是这个示例的实现步骤:
  
  1.启动Visual Studio .Net。
  
  2.选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
  
  3.将【项目类型】设置为【Visual Basic项目】。
  
  4.将【模板】设置为【Windows应用程序】。
  
  5.在【名称】文本框中输入【Visual Basic .Net查看文件中的图标】。
  
  6. 在【位置】的文本框中输入【E:/VS.NET项目】,然后单击【确定】按钮,这样在【E:/VS.NET项目】目录中就产生了名称为【Visual Basic .Net查看文件中的图标】文件夹,里面存放着【Visual Basic .Net查看文件中的图标】项目的所有文件。具体如图02所示:
 
  

图02:【Visual Basic .Net查看文件中的图标】项目的【新建项目】对话框


  7. 选择菜单【项目】|【添加新项】,在弹出的对话框中的【模板】设置为【模块】,【名称】文本框设置为【Module1.vb】后。单击【打开】按钮,则在项目中增加了一个模板文件,名称为【Module1.vb】。
  
  8. 把Visual Stuido .Net的当前窗口切换到Module1.vb的代码编辑窗口,并在其Module1的代码区中添加下列代码,下列代码是用二种方式声明二个Windows API函数:
  
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As String , ByVal uiIconIndex As UInt32  

 

相关文章推荐

VB.NET调用Windows API函数(整理中)

1、发送Windows消息: Private Declare Auto Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal...

VB.net调用C++ 6.0 DLL内部函数

VB.net调用C++ 6.0 DLL内部函数动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、新特性都是通过DLL来实现的。其实,Windows本身就是由许多DLL组成...

VB.NET中调用WNET函数

vb.net 教程 3-3 窗体编程 消息对话框

vb初出来时,大家眼睛为之一亮,就是因为其可视化的编程,当然这个编程离不开各种控件的支持,本节以及后续的几节都主要是讲vb.net中自带的控件使用。 个人理解:windows系统是消息驱动型的系统...

Ap.net编程指南.chm

  • 2007-07-14 09:09
  • 35KB
  • 下载

vb.net 教程 3-4 窗体编程 公共控件9 ListView 6

前面几节将ListView讲的差不多了,本节主要补充讲一些可能会很少用到的内容。 1、关于Listview中修改整行的数据: 通过 ListView1.Items(序号).BackColor和 L...

VB.Net数据库编程

众所周知,VB.NET自身并不具备对数据库进行操作的功能,它对数据库的处理是通过.NET FrameWork SDK中面向数据库编程的类库和微软的MDAC来实现的。其中,ADO.NET又是.NET F...

vb.net 教程 3-2 窗体编程之窗体 4

本节继续谈谈窗体传递参数 假设我要将Form1中的数据传递到Form2,可以采用以下方法: 首先理解一下:Form2其实是个类 不信,可以仔细打开Form2的代码,看看默认代码第一句是不是 “...

vb.net 教程 3-4 窗体编程 公共控件10 TreeView 3

上一节学习了从vs中利用编辑器手动编辑节点,本节主要谈谈使用代码来编辑节点,实际也就是对TreeNode的操作。 先看看窗体中控件的布局: 为了区别根节点和子节点,特地做了点区分。 窗体载入的时候,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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