当前位置: 网学 > 编程文档 > VB > 正文

VB5.0与Windows API 间的呼叫技巧

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/16
下载{$ArticleTitle}原创论文样式
am, // undefined
LPARAM lParam // 为一个EVENTMSG Structure的address值
);

这个JournalRecordProc 对应到我们的HookProc便是

Function HookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long

-----------------------------------------------------------------------------
有没有注意到第三个参数它是一个 ByVal的Long,指的是存放某一个EVENTMSG的位址,
而先前我们提过,自定型态的参数传递要使用ByRef的方式才能解决,天啊!它用ByVal
的方式来做,如果是C语言,那不成问题,只要如下:

-----------------------------------------------------------------------------
EVENTMSG *p;
P = (EVENTMSG *) lParam;
-----------------------------------------------------------------------------
如此便可以用 *p->message 之方式来取得内容,但VB呢?这里便要用些小技巧了,试
想,如果我们能依lParam所指的位址,一个Byte一个Byte的Copy到一个EVENTMSG的变

上面,不就可以了吗?所以了, CopyMomory这个函式派上用场了,但是 CopyMomory的
原始宣告如下,前面两个参数都是ByRef的方式,但目前对我们有的是lParam的内容(假
设是lParam = 25600, Address of lParam = 100100),如果我们使用底下的宣告,而去
呼叫
-- 宣告一 ----------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy as Long)

CopyMomory msg , lParam, Lenb(msg)
-----------------------------------------------------------------------------
那麽WinAPI RtlMoveMemory会得到第二个参数值=100100,而使指标指到100100的位址
,那麽就得不到想要的资料了 (因资料在25600的位址上)。所以我们改变原始宣告,将
之变成宣告二的样子,如此VB 第二个参数的作法会传出25600(因为ByVal嘛)给RtlMoveMe
mory,那不就成功了吗?

----宣告二 ---------------------------------------------------------------------
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy as Long)

CopyMomory msg , lParam, Lenb(msg)
-----------------------------------------------------------------------------
或许这RtlMoveMemory您在许多地方都会用上,前两个参数时而要ByRef, 时而需
ByVal,那是否就要定义四个宣告来因应不同之需,其实也不用,上面的例子中,只要
宣告成宣告一的样子,但是呼叫时改成:

CopyMemory msg, ByVal lParam, Lenb(msg)

在第二个参数前加上ByVal这样这可以了啦。

这里还有另外一个做法,那就是从Hook Procedure的宣告著手,别忘了,Hook Pro
cedure是Window所呼叫的,所以它传给我们定义的HookProc()时,第三个参数以先前的
举例来说便是传入25600,那麽,我们将HookProc()改定义成:

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long, _
lParam As Long) As Long
-----------------------------------------------------------------------------
第三个参数变成 ByRef的方式传入,所以了,用msg = lParam来取代CopyMemory的
作法, 嘛可以通啦!即如下:

-----------------------------------------------------------------------------
Function HookProc(ByVal code As Long, ByVal wParam As Long, _
lParam As Long) As Long ''lParam改成ByRef
msg = lParam
'' CopyMemory msg, lParam, Lenb(msg
  • 上一篇资讯: 用VB编写登录程序
  • 下一篇资讯: VB中实现MD5加密
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号