知识大全 VB动态调用外部函数的方法

Posted 函数

篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VB动态调用外部函数的方法相关的知识,希望对你有一定的参考价值。

VB动态调用外部函数的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  VB可以用Declare声明来调用标准DLL的外部函数 但是其局限性也很明显 利用Declare我们只能载入在设计时通过Lib和Alias字句指定的函数指针!而不能在运行时指定由我们自己动态载入的函数指针) 不能用Declare语句来调用任意的函数指针 当我们想动态调用外部函数的时候 就必须考虑采用其他的辅助方法 来完成这个任务了

  对我这样的菜鸟还有点深奥 在资料搜索过程中 找到通过在VB中调入汇编程序 比较简便的实现了这个功能 下面就是实现原理

   )使用LoadLibrary加载DLL;

   )GetProcAddress获得函数指针

  以上两步得到了预加载函数的指针 但是VB中没有提供使用这个指针的方法 我们可以通过一段汇编语言 来完成函数指针的调用!

   )通过汇编语言 把函数的所有参数压入堆栈 然后用Call待用函数指针就可以了

  实现以上功能的主要程序

   加载Dll

  LibAddr = LoadLibrary(ByVal user )

   获得函数指针

  ProcAddr = GetProcAddress(LibAddr ByVal MessageBoxA )

   原型为MessageBox(hWnd lpText lpCaption uType)

   以下为Assembly部分

  push uType

  push lpCaption

  push lpText

  push hWnd

  call ProcAddr

  

  FreeLibrary LibAddr 释放空间

  嘿源码天空 够简单吧!下面是动态调用MessageBoxA的源代码 上面的步骤被封装到RunDll 函数中 可放到模块(CallAPIbyName bas)中

  Dim s () As Byte s () As Byte

  Dim ret As Long

  s = StrConv( Hello~World vbFromUnicode)

  s = StrConv( VBNote vbFromUnicode)

  ret = RunDll ( user MessageBoxA hwnd VarPtr(s ( )) VarPtr(s ( )) &)

  CallAPIbyName bas中的源代码

  Option Explicit

  Private Declare Function LoadLibrary Lib kernel Alias LoadLibraryA (ByVal lpLibFileName As String) As Long

  Private Declare Function GetProcAddress Lib kernel (ByVal hModule As Long ByVal lpProcName As String) As Long

  Private Declare Function CallWindowProc Lib User Alias CallWindowProcA (ByVal lpPrevWndFunc As Long ByVal hWnd As Long ByVal Msg As Long ByVal wParam As Long ByVal lParam As Long) As Long

  Private Declare Function FreeLibrary Lib kernel (ByVal hLibModule As Long) As Long

  Private Declare Sub CopyMemory Lib kernel Alias RtlMoveMemory (lpDest As Any lpSource As Any ByVal cBytes As Long)

  Public m_opIndex As Long 写入位置

  Private m_OpCode() As Byte  Assembly 的OPCODE

  Public Function RunDll (LibFileName As String ProcName As String ParamArray Params()) As Long

  Dim hProc As Long

  Dim hModule As Long

  ReDim m_OpCode( + * UBound(Params)) 保留用来写m_OpCode

   读取API库

  hModule = LoadLibrary(ByVal LibFileName)

  If hModule = Then

  MsgBox Library读取失败!

  Exit Function

  End If

   取得函数地址

  hProc = GetProcAddress(hModule ByVal ProcName)

  If hProc = Then

  MsgBox 函数读取失败! vbCritical

  FreeLibrary hModule

  Exit Function

  End If

   执行Assembly Code部分

  RunDll = CallWindowProc(GetCodeStart(hProc Params) )

  FreeLibrary hModule 释放空间

  End Function

  Private Function GetCodeStart(ByVal lngProc As Long ByVal arrParams As Variant) As Long

   以下为Assembly部分

   作用 将函数的参数压入堆栈

  Dim lngIndex As Long lngCodeStart As Long

   程序起始位址必须是 的倍数

   VarPtr函数是用来取得变量的地址

  lngCodeStart = (VarPtr(m_OpCode( )) Or &HF) +

  m_opIndex = lngCodeStart VarPtr(m_OpCode( )) 程序开始的元素的位置

   前面部分以中断点添满

  For lngIndex = To m_opIndex

  m_OpCode(lngIndex) = &HCC int

  Next lngIndex

   以下开始放入所需的程序

   将参数push到堆栈

   由于是STDCall CALL 参数由最后一个开始放到堆栈

  For lngIndex = UBound(arrParams) To Step

  AddByteToCode &H push的机器码为H

  AddLongToCode CLng(arrParams(lngIndex))  参数地址

  Next lngIndex

   call hProc

  AddByteToCode &HE call的机器码为HE

  AddLongToCode lngProc VarPtr(m_OpCode(m_opIndex)) 函数地址 用call的定址

   结束所需的程序

   返回呼叫函数

  AddByteToCode &HC ret h

  AddByteToCode &H

  AddByteToCode &H

  GetCodeStart = lngCodeStart

  End Function

  Private Sub AddLongToCode(lData As Long)

   将Long类型的参数写到m_OpCode中

  CopyMemory m_OpCode(m_opIndex) lData

  m_opIndex = m_opIndex +

  End Sub

  Private Sub AddIntToCode(iData As Byte)

   将Integer类型的参数写道m_OpCode中

  CopyMemory m_OpCode(m_opIndex) iData

  m_opIndex = m_opIndex +

  End Sub

  Private Sub AddByteToCode(bData As Byte)

   将Byte类型的参数写道m_OpCode中

  m_OpCode(m_opIndex) = bData

  m_opIndex = m_opIndex +

cha138/Article/program/net/201311/13062

相关参考

知识大全 在PB中调用外部函数[2]

在PB中调用外部函数[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  例如对SCOTT用户的

知识大全 在PB中调用外部函数[1]

在PB中调用外部函数[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ORACLE数据库的P

知识大全 在C#中动态调用native dll的导出函数

在C#中动态调用nativedll的导出函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在C

知识大全 c#webservice的简单示例

  是webservice就概念上来说可能比较复杂不过我们可以有个宏观的了解webservice就是个对外的接口里面有函数可供外部客户调用(注意里面同样有客户不可调用的函数)假若我们是服务端我们写好了

知识大全 VB.NET编程中调用Windows API

VB.NET编程中调用WindowsAPI  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Windo

知识大全 VB.Net调用存储过程并得到返回值

VB.Net调用存储过程并得到返回值  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //存储过程

知识大全 如何在ASP代码中调用VB组件的方法

如何在ASP代码中调用VB组件的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本篇文章通过

知识大全 VB中FSO的调用的二种方法

VB中FSO的调用的二种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  方法一:  Dim&

知识大全 VB Shell调用后 等待程序运行结束

VBShell调用后等待程序运行结束  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    Priv

知识大全 以在ASP环境下调用的运行CMD命令的VB组件

以在ASP环境下调用的运行CMD命令的VB组件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有