包含vb.net调试类库的词条( 二 )


一.平台调用、托管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函数的代码也可以简化为如下所示:

推荐阅读