VB动态调用外部函数的方法

文章作者 100test 发表时间 2011:08:01 11:33:18
来源 100Test.Com百考试题网


  导读:VB可以用Declare声明来调用标准DLL的外部函数,但是其局限性也很明显:利用Declare我们只能载入在设计时通过Lib和Alias字句指定的函数指针!而不能在运行时指定由我们自己动态载入的函数指针),不能用Declare语句来调用任意的函数指针。当我们想动态调用外部函数的时候,就必须考虑采用其他的辅助方法,来完成这个任务了。
  在文章《VB真是想不到系列之三:VB指针葵花宝典之函数指针 》、《Matthew Curland的VB函数指针调用》、《利用动态创建自动化接口实现VB的函数指针调用》等文献中对此问题都进行了一定程度上的讨论,但是头绪都很繁琐,对我这样的菜鸟还有点深奥,在资料搜索过程中,找到通过在VB中调入汇编程序,比较简便的实现了这个功能,下面就是实现原理:
  1)使用LoadLibrary加载DLL;
  2)GetProcAddress获得函数指针;
  以上两步得到了预加载函数的指针,但是VB中没有提供使用这个指针的方法。我们可以通过一段汇编语言,来完成函数指针的调用!
  3)通过汇编语言,把函数的所有参数压入堆栈,然后用Call待用函数指针就可以了。
  实现以上功能的主要程序:
  ′加载Dll
  LibAddr = LoadLibrary(ByVal "user32")
  ′获得函数指针
  ProcAddr = GetProcAddress(LibAddr, ByVal "MessageBoxA")
  ′原型为MessageBox(hWnd, lpText, lpCaption, uType)
  ′---以下为Assembly部分---
  push uType
  push lpCaption
  push lpText
  push hWnd
  call ProcAddr
  ′--------------------
  FreeLibrary LibAddr′释放空间
  嘿,够简单吧!下面是动态调用MessageBoxA的源代码,上面的步骤被封装到RunDll32函数中,可放到模块(CallAPIbyName.bas)中:
  Dim s1() As Byte, s2() As Byte
  Dim ret As Long
  s1 = StrConv("Hello~World", vbFromUnicode)
  s2 = StrConv("VBNote", vbFromUnicode)
  ret = RunDll32("user32", "MessageBoxA", hwnd, VarPtr(s1(0)), VarPtr(s2(0)), 0

相关文章


VB6把彩色图片变成灰阶的方法
基于VBA组卷中自动排版的实现
VB6的后期绑定和前期绑定
处理字符串中的字符
VB动态调用外部函数的方法
2011年计算机二级VFP上机考试冲刺模拟试题(75)
2011年计算机二级VFP上机考试冲刺模拟试题(74)
2011年计算机二级VFP上机考试冲刺模拟试题(73)
2011年计算机二级VFP上机考试冲刺模拟试题(72)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛