文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

VB.NET如何声明API

2023-06-17 21:38

关注

这篇文章主要介绍了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声明先:

Declare Function SubClass& Lib "dssubcls" (ByVal HwndSubclass&, _  Optional ByVal Address& = 0, _  Optional ByVal OldStyle& = 0, _  Optional ByVal NewStyle& = 0, _  Optional ByVal Ext& = 0, _  Optional ByVal SubClass& = 0)

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

Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer,   Optional ByVal Address As Integer = 0, 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 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 

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

Private fix_COCD = New HookCallBack(AddressOf mCallback)

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

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 

感谢你能够认真阅读完这篇文章,希望小编分享的“VB.NET如何声明API”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯