- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll
导出的函数的一个方便办法
自从会vb用调用动态库函数以来,我一直在想如何动态的调用dll
里的函数?网上有一个用CallWindowProc函数的方法,不过我还是喜
欢自己有个
办法.今天工夫不负有心人,我终于把我心中一直想的办法给实现了,
干脆就往自己的空间上贴吧.错误的地方,希望可以得到有这方面的师傅
给以
指正,以求进步!对于系统api我没有尝试,如果调用约定相符,应该
适用于对系统api的调用.
我自己用c写个dll,然后在vb里写了这个类.
以下代码只是我简单的实现,主要的是看实现的道理.
vc代码
///
我把dll文件名命名为dll
#includeWindows.h
#includestdlib.h
#includestring.h
#includestdafx.h
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
{
returnTRUE;
}
externCBOOL_declspec(dllexport)add(inta)
{
MessageBoxA(NULL,运行在dll里!,成功,MB_OK);
a=999;
return1;
}
///
vb代码
类代码
Private状态标志AsBoolean
Private模块句柄AsLong
Private本地函数地址备份(0To4)AsByte
Private被替换函数的地址AsLong
PublicFunction替换函数地址(模块名AsString,函数名As
String,本地函数地址AsLong)AsBoolean
If0=本地函数地址Then
替换函数地址=0
ExitFunction
EndIf
被替换函数的地址=替换函数地址
Dim函数地址AsLong
DimaAsLong
Dim跳转指令(0To4)AsByte
加载模块
模块句柄=LoadLibrary(模块名)
If0模块句柄Then
状态标志=1
Else
替换函数地址=0
ExitFunction
EndIf
检索函数地址
函数地址=GetProcAddress(ByVal模块句柄,ByVal函数名)
If0函数地址Then
状态标志=1
Else
替换函数地址=0
ExitFunction
EndIf
计算跳转地址
a=函数地址-(本地函数地址+5)
构造跳转地址
跳转指令(0)=233
a=WriteProcessMemory(-1,ByValVarPtr(跳转指令(1)),
ByValVarPtr(a),4,0)
If0=aThen
替换函数地址=0
ExitFunction
EndIf
先备份本地函数入口指令
a=WriteProcessMemory(-1,ByValVarPtr(本地函数地址备份
(0)),ByVal本地函数地址,5,0)
If0=aThen
替换函数地址=0
ExitFunction
EndIf
写入跳转指令
a=WriteProcessMemory(-1,ByVal本地函数地址,ByVal
VarPtr(跳转指令(0)),5,0)
If
文档评论(0)