VB静态调用与动态调用dll详解
【【请注意】】:在以下语法格式中,请注意 [函数名] 的【大小写】!!!
静态与动态比较:
静态调用简单,动态调用麻烦;静态调用占用资源多,动态调用占用资源少;正所谓鱼和熊掌不可兼得。
静态调用定义:
就是常用的申明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 |
解决办法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详解相关推荐
- linux mysql 静态库_Linux静态库与动态库实例详解
Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include "test.h" int main(){ te ...
- window下动态库dll详解
引言 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用.在构造软件系统时,如果将所 ...
- JNI_Android项目中调用.so动态库实现详解【转】
转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...
- linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解
内核源码树的目录下都有两个文档Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单.在内核配置m ...
- 静态代理与动态代理模式详解(优缺点分析,实例分析,读源码必备)
1.代理模式 (1)概念 代理就是帮别人做事情,如:工厂的中介,中介负责为工厂招收工人,那么中介就是工厂的代理:客户通过商家购买东西,商家向厂家购买货物,商家就是工厂的代理 在开发中存在a类需要调用c ...
- 静态网页和动态网页技术详解
静态网页 一.静态网页的特点 1. 所谓静态是指的就是网站内容固定不变. 静态网页一经制成,内容就不会再变化, 如要修改网页的内容,就必须修改源码,重新上传到服务器. 2. 静态网页内容通常以HTM ...
- 【VB技巧】VB静态调用与动态调用dll详解
[[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!!静态与动态比较:静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得.静态调用定义:就是常 ...
- php调用C代码的方法详解和zend_parse_parameters函数详解
来源:http://my.oschina.net/Customs/blog/490873 http://blog.csdn.net/super_ufo/article/details/3863731 ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
最新文章
- 量化人类社会交互行为
- 故事营销:一个具有争议的成功营销案例
- Hadoop学习笔记—18.Sqoop框架学习
- MySQL avg()函数
- php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...
- 升级Struts2.5后使用DMI动态方法调用遇到问题
- TiDB备份恢复方式你知多少?
- 实践录丨如何在鲲鹏服务器OpenEuler操作系统中快速部署OpenGauss数据库
- 利用SiteMapPath控件做论坛导航
- sqlite 无符号32_《符号与传媒》2020年总目录
- python详细安装教程-python安装教程 Pycharm安装详细教程
- Maven项目添加ojdbc8
- 常见iPhone设备尺寸及分辨率(持续更新)
- sox 转换pcm格式采样率
- 微信小程序源码获取(附工具的下载)
- 《活着》读后感4500字
- 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办?
- 人物志 | 美团首席科学家夏华夏:不断突破边界的程序人生
- 中国10大经典徒步线路(资深徒步专家@行摄匆匆推荐)
- oracle入门操作3(关于查询 )
热门文章
- Python-pyinstaller打包与ico生成
- Windows下 OpenAcs测试平台搭建
- Android studio 学生信息录入表(课堂作业)
- layui下拉框监听点击
- 查看fna文件Linux,NCBI上基因组文件格式及解释
- 《工程伦理与学术道德》之《工程师的职业伦理》
- 2022-01-19 微信小程序-萌宠大作战项目(一) 项目思路和效果,map组件的介绍和使用,视图容器cover-image,首页的制作
- 【Verilog基础】Verilog实现加扰器(Scrambler )与解扰器(Descrambler)
- CPU_Z计算机主板性能表,您如何看待CPU-Z的参数? CPU-Z对CPU型号进行全面分析
- 系统压缩文件中字母都表示什么意思