VB.NET声明API详细描述

开发 后端
这里介绍VB.NET声明API,包括介绍VB6的代码大家可以在下载的压缩包中找到,作者提供了一个以记事本为基础的实例,非常详细无需详细叙述了。

在向大家详细介绍VB.NET声明API之前,首先让大家了解下API函数和DLL去修改目标窗口的默认处理函数,然后全面介绍VB.NET声明API。

我们都知道在VB6里面可以用API函数来进行子类化,以处理自身的窗体过程;如果跨进程,这就麻烦了,由于我们的函数在我们的进程中(废话),而目标进程的窗口的消息处理函数在目标进程(还是废话),所以只能想办法把我们的代码放到对方进程中去执行——并且要告知我们的进程得到了什么消息。恐怕写汇编就有点吓人了,于是大家都写DLL,其原理就是把回调函数放到一个DLL里面注入到对方进程,DLL去修改目标窗口的默认处理函数——把消息发送给我们。

当然也有“另类”一点的:http://www.it-berater.org/ThueDownloads/index.shtml上面有一个 DLL包,其中含有一个dssubcls.dll,用它,可以轻松的完成我们的工作:就像调用一个API一样简单,而且在我们的程序中使用回调函数!呵呵,省去了自己写DLL的麻烦之后,这些好处足以吸引各位观众了吧?

好了,VB6的代码大家可以在下载的压缩包中找到,作者提供了一个以记事本为基础的实例(在\dssubcls目录下),非常详细无需详细叙述了。关键是在VB.NET里面如何使用它——如何声明API,如何进行回调,看用来子类化的API的VB6声明先:

  1. Declare Function SubClass& Lib "dssubcls" (ByVal HwndSubclass&, _  
  2. Optional ByVal Address& = 0, _  
  3. Optional ByVal OldStyle& = 0, _  
  4. Optional ByVal NewStyle& = 0, _  
  5. Optional ByVal Ext& = 0, _  
  6. Optional ByVal SubClass& = 0) 

转化成VB.NET声明API类似下面的样子(习惯使然,我把&展开成了As Integer):

  1. Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer,   
  2. Optional ByVal Address As Integer = 0, Optional ByVal OldStyle As Integer = 0,   
  3. Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0,   
  4. Optional ByVal SubClass As Integer = 0) As Integer 

这不是很好嘛?问题来了,这样的声明在VB6里面可以使用Addressof function来传入第二个参数(参见你下载的源码),但是在VB.NET里面直接Addressof就不成了——我们需要委托一个回调:

  1. Private Delegate Function HookCallBack(ByVal wMsg As Integer, 
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer 

这个委托,对应的是以下函数:

  1. Private Function mCallback(ByVal wMsg As Integer, 
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer  
  2. ‘在这里处理得到的消息  
  3. End Function 

使用时,需要注意先实例化这个委托:

  1. Private fix_COCD = New HookCallBack(AddressOf mCallback) 

此时,fix_COCD就是我们的mCallback函数引用了,用更直观的观点来看,fix_COCD就是一个指向mCallback的指针,相当于 VB6里面的Addressof function得到的结果,看似问题解决了,于是我们写了以下代码来搞对方的进程窗体消息:

  1. SubClass(Handle, fix_COCD, 0, 0, 0, 1) '修改处理函数 

问题真是接踵而至!IDE提示变量类型不符!!事实确实如此,我们把一个HookCallBack类型当做Integer来传递,无法通过检查,那么强行转换吧?当然,你可以去试试。这时,我所做的是,修改这个API声明:

  1. Private Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer, 
    Optional ByVal Address As 
    HookCallBack = Nothing, Optional ByVal OldStyle As Integer = 0
    Optional ByVal NewStyle As 
    Integer = 0, Optional ByVal Ext As Integer = 0
    Optional ByVal SubClass As 
    Integer = 0) As Integet 

使之符合我们的调用?有点倒行逆施?并非如此,当你习惯了修改API声明之后,会发现有些事变得如此简单,有些事需要你重新认识——对于WIN32 API也是如此。

至此,VB.NET声明API大功告成。

【编辑推荐】

  1. 详细讲述VB.NET开发控件
  2. VB.NET Control类的属性和方法
  3. 解析VB.NET如何连接数据库
  4. VB.NET应用程序中多线程的应用实例
  5. 浅析VB.NET程序学习经验
责任编辑:佚名 来源: chinaitlab
相关推荐

2009-10-13 17:16:40

VB.NET Web服

2009-10-15 15:04:42

VB.NET PadL

2009-10-10 16:15:49

VB.NET开发多线程

2009-10-20 14:21:55

VB.NET fnSi

2009-10-16 11:02:40

VB调用动态连接库

2009-10-19 14:22:13

VB.NET EIF体

2009-10-20 14:09:05

VB.NET反射功能

2009-10-27 12:06:01

VB.NET IDis

2009-10-15 09:02:19

VB.NET申明数组

2009-10-14 13:56:05

VB.NET数据窗体

2009-10-28 09:55:29

VB.NET MyCl

2009-11-11 13:24:29

VB.NET事件

2010-01-22 10:41:33

VB.NET声明结构

2010-01-21 16:37:56

VB.NET变量声明

2009-10-13 09:33:49

VB.NET Web

2009-10-30 11:20:54

VB.NET Proc

2011-05-20 16:34:35

VB.NET

2009-09-14 14:58:52

LINQ to XML

2009-09-14 13:14:49

LINQ序列

2009-10-14 09:15:15

点赞
收藏

51CTO技术栈公众号