




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法自从会vb用调用动态库函数以来,我一直在想:如何动态的调用dll里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜欢自己有个办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,干脆就往自己的空间上贴吧.错误的地方,希望可以得到有这方面的师傅给以指正,以求进步!对于系统api我没有尝试,如果调用约定相符,应该适用于对系统api的调用.我自己用c写个dll,然后在vb里写了这个类.以下代码只是我简单的实现,主要的是看实现的道理.vc代码:///'我把dll文件名命名为:dll#include<Windows.h>#include<stdlib.h>#include<string.h>#include'stdafx.h'BOOLAPIENTRYDllMain(HANDLEhModule,DWORD
ul_reason_for_call,LPVOIDlpReserved){returnTRUE;}extern'C'BOOL_declspec(dllexport)add(inta){MessageBoxA(NULL,'运行在dll里!','成功',MB_OK);a=999;return1;}///vb代码:'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''类代码:Private状态标志AsBooleanPrivate模块句柄AsLongPrivate本地函数地址备份(0To4)AsBytePrivate被替换函数的地址AsLongPublicFunction替换函数地址(模块名AsString,函数名AsString,本地函数地址AsLong)AsBoolean
If0=本地函数地址Then替换函数地址=0ExitFunctionEndIf
被替换函数的地址=替换函数地址Dim函数地址AsLongDimaAsLongDim跳转指令(0To4)AsByte
'加载模块模块句柄=LoadLibrary(模块名)If0<>模块句柄Then'状态标志=1Else:替换函数地址=0ExitFunctionEndIf'检索函数地址函数地址=GetProcAddress(ByVal模块句柄,ByVal函数名)If0<>函数地址Then'状态标志=1Else替换函数地址=0ExitFunctionEndIf'计算跳转地址a=函数地址-(本地函数地址+5)'构造跳转地址跳转指令(0)=233a=WriteProcessMemory(-1,ByValVarPtr(跳转指令(1)),ByValVarPtr(a),4,0)If0=aThen替换函数地址=0ExitFunctionEndIf'先备份本地函数入口指令a=WriteProcessMemory(-1,ByValVarPtr(本地函数地址备份(0)),ByVal本地函数地址,5,0)If0=aThen替换函数地址=0ExitFunctionEndIf'写入跳转指令a=WriteProcessMemory(-1,ByVal本地函数地址,ByValVarPtr(跳转指令(0)),5,0)If0=aThen替换函数地址=0ExitFunctionElse:状态标志=1替换函数地址=1EndIfEndFunctionPublicFunction还原函数地址()AsBooleanIf0=状态标志Then还原函数地址=0ExitFunctionEndIfDimaAsLonga=WriteProcessMemory(-1,ByVal被替换函数的地址,ByValVarPtr(本地函数地址备份(0)),5,0)If0=aThen还原函数地址=0ExitFunctionElse:状态标志=0还原函数地址=1EndIfFreeLibrary模块句柄EndFunctionPublicFunction当前状态()AsBoolean当前状态=状态标志EndFunction''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''vb普通模块代码:'读写内存的api函数PublicDeclareFunctionWriteProcessMemoryLib'kernel32'(ByValhProcessAsLong,ByVal_lpBaseAddressAsAny,lpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong'加载模块的api函数PublicDeclareFunctionLoadLibraryLib'kernel32'Alias'LoadLibraryA'(ByVallpLibFileNameAsString)AsLong'检索模块里函数地址的api函数PublicDeclareFunctionGetProcAddressLib'kernel32'(ByValhModuleAsLong,ByVallpProcNameAsString)AsLong'PublicDeclareFunctionFreeLibraryLib'kernel32'(ByValhLibModuleAsLong)AsLong'模拟一个函数与dll里,我们想调用函数类型和参数一致,用类将函数的地址替换PublicFunction测试函数(参数AsLong)AsBoolean'我们随便给返回0,因为这个指令将不会被程序执行到测试函数=0EndFunction''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''vb窗口模块代码:PrivateSubForm_Load()Dim模块名AsString,函数名AsString模块名=App.Path+'/dll.dll''模块名现在可以自己定了,自由了!函数名='add'DimpAsBooleanDimaaAsNewClass1p=aa.替换函数地址(模块
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巨人的花园绘本解析
- 171年伦敦协议书
- 通江人才引进协议书
- 集体买卖树木协议书
- 车位长期出租协议书
- 项目申报代理协议书
- 东营区供热合作协议书
- 销售总监任务协议书
- 鞋子材料购销协议书
- 餐饮合同扣款协议书
- 吊篮安装安全技术交底
- 2024版建筑工程外架拆除承包合同2篇
- SVG工作原理及基础知识
- T-CBIA 009-2022 饮料浓浆标准
- 2025届高三地理一轮复习课件第二部分+4.2区域发展对交通运输布局的影响
- 乳腺癌术后出血护理
- 《快速时尚品牌》课件
- 2024中华人民共和国学前教育法详细解读课件
- 2024-2030年中国吡啶行业发展可行性及投资规划分析报告
- 无人机在应急救灾领域下的应用
- 中华护理学会团体标准-气管切开非机械通气患者气道护理
评论
0/150
提交评论