【【请注意】】:在以下语法格式中,请注意 [函数名] 的【大小写】!!!

静态与动态比较:

静态调用简单,动态调用麻烦;静态调用占用资源多,动态调用占用资源少;正所谓鱼和熊掌不可兼得。

静态调用定义:

就是常用的申明API,一个DLL库里有很多的函数可供调用,把要用的申明即可。
    比如:Public/Private Declare Function [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]
    示例:Private Declare Function Test Lib "dll.dll" (x As String) As String
    当程序结束的时候系统回自动释放DLL调用。

动态调用定义:

使用LoadLibery(DLL名),系统会检查DLL是否调入内存。如果调入了,可直接调用DLL里的所有函数,没有就会把DLL加入目标进程的进程空间。通过函数GetProcAddress确定函数入口地址,然后调用,后一种方法VB里不常用的。

静态调用详解:

制作好DLL之后,首先用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。

语法格式1:
        Public/Private Declare Sub [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表)

语法格式2:
        Public/Private Declare Function [函数名] Lib "DLL文件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]

在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。

例如add.DLL在VB中就可以声明为:
        Declare Function ADD Lib "c:\add.dll" (ByVal X AS Integer, ByVal Y AS Integer, ByVal filein as string) AS Integer

通过此声明语句将函数ADD声明到VB中,便可直接调用。

动态调用详解:

首先调用API LoadLibaray 装载dll,然后调用API GetProcAddress 得到dll的对应方法的地址。因为vb不像其他的有函数指针,在vb中声明函数原形,怎样把得到的函数地址赋给这个原形有些麻烦。

解决办法1:

Option Explicit 
 
'我们要调用没有声明的API(dll)的功能! 
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long '释放LoadLibrary载入的动态链接库,非零表示成功,零表示失败。 
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long '载入指定动态链接库,成功则返回库模块的句柄,零表示失败。 
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long '检索指定的动态链接库(DLL)中的输出库函数地址(超找函数入口地址),成功则返回值是DLL中的输出函数地址,失败返回值是NULL。 
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long '将消息信息传送给指定的窗口过程。 
 
Private Sub Form_Load() 
    Dim LibHand As Long '载入的dll句柄 
    LibHand = LoadLibrary("user32")     '将user32载入到内存。 
    CallWindowProc GetProcAddress(LibHand, "SetWindowTextA"), Me.hWnd, CStr(Now), ByVal 0&, ByVal 0& '调用SetWindowTextA函数功能 
    FreeLibrary LibHand '释放映射库的地址 
End Sub

解决办法2:
 
下面是动态调用MessageBoxA的源代码,上面的步骤被封装到RunDll32函数中,可放到模块(CallAPIbyName.bas)中: 
    Dim s1() As Byte, s2()   As Byte 
    Const hWnd = 0 
    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&) 
End Sub 
 
Public Function RunDll32(LibFileName As String, ProcName As String, ParamArray Params()) As Long 
    Dim hProc As Long 
    Dim hModule As Long 
    ReDim m_OpCode(400 + 6 * UBound(Params))    '保留用来写m_OpCode 
    hModule = LoadLibrary(ByVal LibFileName)    '读取API库 
    If hModule = 0 Then 
MsgBox "Library读取失败!" 
Exit Function 
    End If 
    hProc = GetProcAddress(hModule, ByVal ProcName)     '取得函数地址 
    If hProc = 0 Then 
MsgBox "函数读取失败!", vbCritical 
FreeLibrary hModule 
Exit Function 
    End If 
    RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)  '执行Assembly   Code部分 
    FreeLibrary hModule '释放空间 
End Function

解决办法3:

在VB中嵌入汇编实现。loadlibary取得DLL,GetProcAddress取得函数地址,用VB嵌入汇编的写法压所需参数,CallWindowProc调用GetProcAddress返回的地址。

本文“【VB技巧】VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心

VB静态调用与动态调用dll详解相关推荐

  1. linux mysql 静态库_Linux静态库与动态库实例详解

    Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include "test.h" int main(){ te ...

  2. window下动态库dll详解

    引言 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用.在构造软件系统时,如果将所 ...

  3. JNI_Android项目中调用.so动态库实现详解【转】

    转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...

  4. linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解

    内核源码树的目录下都有两个文档Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单.在内核配置m ...

  5. 静态代理与动态代理模式详解(优缺点分析,实例分析,读源码必备)

    1.代理模式 (1)概念 代理就是帮别人做事情,如:工厂的中介,中介负责为工厂招收工人,那么中介就是工厂的代理:客户通过商家购买东西,商家向厂家购买货物,商家就是工厂的代理 在开发中存在a类需要调用c ...

  6. 静态网页和动态网页技术详解

    静态网页 一.静态网页的特点 1. 所谓静态是指的就是网站内容固定不变.  静态网页一经制成,内容就不会再变化, 如要修改网页的内容,就必须修改源码,重新上传到服务器. 2. 静态网页内容通常以HTM ...

  7. 【VB技巧】VB静态调用与动态调用dll详解

    [[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!!静态与动态比较:静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得.静态调用定义:就是常 ...

  8. php调用C代码的方法详解和zend_parse_parameters函数详解

    来源:http://my.oschina.net/Customs/blog/490873 http://blog.csdn.net/super_ufo/article/details/3863731 ...

  9. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

最新文章

  1. 量化人类社会交互行为
  2. 故事营销:一个具有争议的成功营销案例
  3. Hadoop学习笔记—18.Sqoop框架学习
  4. MySQL avg()函数
  5. php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
  6. 升级Struts2.5后使用DMI动态方法调用遇到问题
  7. TiDB备份恢复方式你知多少?
  8. 实践录丨如何在鲲鹏服务器OpenEuler操作系统中快速部署OpenGauss数据库
  9. 利用SiteMapPath控件做论坛导航
  10. sqlite 无符号32_《符号与传媒》2020年总目录
  11. python详细安装教程-python安装教程 Pycharm安装详细教程
  12. Maven项目添加ojdbc8
  13. 常见iPhone设备尺寸及分辨率(持续更新)
  14. sox 转换pcm格式采样率
  15. 微信小程序源码获取(附工具的下载)
  16. 《活着》读后感4500字
  17. 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办?
  18. 人物志 | 美团首席科学家夏华夏:不断突破边界的程序人生
  19. 中国10大经典徒步线路(资深徒步专家@行摄匆匆推荐)
  20. oracle入门操作3(关于查询 )

热门文章

  1. Python-pyinstaller打包与ico生成
  2. Windows下 OpenAcs测试平台搭建
  3. Android studio 学生信息录入表(课堂作业)
  4. layui下拉框监听点击
  5. 查看fna文件Linux,NCBI上基因组文件格式及解释
  6. 《工程伦理与学术道德》之《工程师的职业伦理》
  7. 2022-01-19 微信小程序-萌宠大作战项目(一) 项目思路和效果,map组件的介绍和使用,视图容器cover-image,首页的制作
  8. 【Verilog基础】Verilog实现加扰器(Scrambler )与解扰器(Descrambler)
  9. CPU_Z计算机主板性能表,您如何看待CPU-Z的参数? CPU-Z对CPU型号进行全面分析
  10. 系统压缩文件中字母都表示什么意思