1、VB 简单易用,但功能有时候受限制。VC、Delphi 都可以直接在程序中写汇编代码,可恼的是,VB 不行。我在网上也看过许多有关于 VB 嵌入汇编的方法,不过有些方法,过于复杂,而且也没相应的介绍。我这里提供一种方法,也许大家以后可能有用!基本思路:汇编代码,可以存在一个 byte 类型的数组中,然后通过某种手段,把系统控制权,转交给这段汇编代码,我们的汇编代码段,就得到了执行。但如何让这段汇编代码,获得系统的控制权限呢?查查 WIN API 手册,就可以知道有 CallWindowProc 这个函数。这个函数本是用于调用用户自己定义的窗口过程的,其原形如下:Function CallWin
2、dowProc Lib “user32“ Alias “CallWindowProcA“ (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 它有 5 个参数。lpPrevWnFunc 是一个 long 型,等于用户自己窗口过程的地址,其余 3 个都是窗口过程所必须的参数,详见 MSDN。我们只需要关心第一个参数:lpPrevWndFunc,窗口过程地址。如果,我们把自己的汇编代码地址,传进去会怎么样?当然
3、,CallWindowProc 就把这个地址,当成窗口过程地址,然后,调用这段汇编代码了。我们的汇编代码便得到执。当然,也得装摸做样的吧,将其余 4 个参数传进去,就传 4 个 0 算了,因为这 4 个参数,我们更本不用,但又是 CallWindowProc 必须的,不要忘了,我们传进去的 lpPrevWndFunc,并非真正的窗口过程地址,而是自己的汇编码地址。具体一点,比如,我们要嵌入一段什么也不干的汇编代码:Dim AsmCode() as byteredim AsmCode(8)生成机器代码AsmCode(0) = 参数入栈 push 0 push 0 push 0 push xxxx00afh;(当执行 call 时,自动执行)为了能让窗口过程执行结束后堆栈指针保持平衡,当然要执行相应的 pop 指令,第一个 pop eax 是把子程序返回的地址暂时保存在寄存器 eax 中,然后弹出 4 个不用的参数。接着把保存在 eax 中返回地址,压回堆栈。当执行 ret 时,就能正确返回到 CallWindowProc 中了。