vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第1页
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第2页
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第3页
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第4页
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论