电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法VIP免费

vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第1页
1/5
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第2页
2/5
vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法_第3页
3/5
vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法自从会vb用调用动态库函数以来,我一直在想:如何动态的调用dll里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜欢自己有个办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,干脆就往自己的空间上贴吧.错误的地方,希望可以得到有这方面的师傅给以指正,以求进步!对于系统api我没有尝试,如果调用约定相符,应该适用于对系统api的调用.我自己用c写个dll,然后在vb里写了这个类.以下代码只是我简单的实现,主要的是看实现的道理.vc代码:///'我把dll文件名命名为:dll#include#include#include#include'stdafx.h'BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_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)AsBooleanIf0=本地函数地址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.替换函数地址(模块名,函数名,AddressOf测试函数)IfpThen测试函数0'将会弹出对话筐:运行在dll里!aa.还原函数地址EndIfEndSub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

vb动态加载dll的一个类-实现vb动态加载dll并动态调用dll导出的函数的一个方便办法

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部