乐易论坛-乐易网易语言培训教程火山PC视窗中文编程交流论坛

 找回密码
 立即注册

手机号登录

用手机号号登陆

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

办理VIP,定制软件,报名培训联系QQ[重磅]2024年实地培训高清培训目录火山PC版乐易模块使用教程
请牢记揰掵佲的QQ号1615457736 1615457734 其他都是骗子有了火山,易语言是否还有必要学习吗?易语言0基础入门课程
火山PC视窗0基础入门课程易语言外挂0基础入门课程火山PC视窗火山HOOK入门课程
易语言误报处理课程QQ空间POST课程2022年火山PC易语言POST系列课程
Android逆向Jeb动态调试0基础课程QQ邮箱网页POST课程WeChat个微Hook实战课程
百日Js加密分析实战课程(无密下载)QQ群POST课程h5游戏WebSocket逆向视频
JavaScript加密特训课程易语言汇编快速入门课程破解实战系列课程
[2024年]火山PC0基础x64位游戏内存辅助开发教程手游模拟器脚本0基础课程易语言加密防破解0基础入门课程
广告位招租联系QQ1615457736  
查看: 12233|回复: 1

[网络教程] [转]动态调用函数DispCallFunc的使用

[复制链接]

[网络教程] [转]动态调用函数DispCallFunc的使用

[复制链接]
已绑定手机
已实名认证
揰掵佲
等级头衔

等級:乐易运营组

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分成就
易币
贡献
主题
精华
金钱
积分
33895
注册时间
2014-8-2
最后登录
1970-1-1

勋章墙

2021-2-22 23:29:08 | 显示全部楼层 |阅读模式

据统计90%查看本帖的人,都已经注册本站了哦

您需要 登录 才可以下载或查看,没有账号?立即注册

×
动态调用函数DispCallFunc的使用|http://bbs.eyuyan.com/read.php?tid=419746




这个WIN32API函数的功能很强大,网上资料也不多,微软官方连个详细的例程都没有,只有一个源码里有使用到,所以会用的人很少。今天就教大家使用这个API。它不仅可以调用系统提供的IUnknown接口类,还可以动态调用WIN32API的函数和DLL命令。

你没有看错,例程里有演示,调用UNICODE的W版的WIN32API:wsprintfWMessageBoxW,分别为_cdecl_stdcall的。
独特的思路,非正常的调用,就不详讲了。原理看例程就明白了。看个人悟性。


下来讲解这个DispCallFunc的正常使用。它就是专为调用接口而设计的,Disp就是IDispatch的意思,专门调用这种接口的。现在以IImgCtx为例,详细讲解它的使用。先看此API的声明。
124_3528_5376907cb76bb5a.jpg

第一个参数:实例指针
其实就是接口指IUnknown*,但是易语言在调用DLL命令时,如果声明为对象型的参数,就会传入IUnknown**接口指针的指针,就算勾选传址,也仍是传IUnknown**,这就不太合理了,API不总是传IUnknown**。所以对象型要转化成IUnknown*,才可以代入参数一。


第二个参数:函数虚表偏移量
就是你要调用的接口方法了,这些方法的函数地址,就是这样按地址顺序排列存贮在内存中,称为虚函数表。我们通过代入指定的偏移量,才可以调用指定的方法,这个参数很重要,写错值就调用失败,程序出错退出。首先,我们看一下接口声明文件,有接口的GUID和方法声明。
124_3528_08def0f2bf0bc50.jpg

方法从0号开始排列,前三个是IUnknown的基本方法,每个接口都有一样的公共方法。从第3号开始才是自有的方法。这个偏移量的计算公式:
偏移量=序号×4
代入到参数二中。


第三个参数:调用约定
在VS的源码文件OAIDL.H里,我们看到这样的声明,这是枚举常量,看到CC_CDECLCC_STDCALL就是我们常用的。

enum tagCALLCONV
    {    CC_FASTCALL    = 0,
    CC_CDECL    = 1,
    CC_MSCPASCAL    = CC_CDECL + 1,
    CC_PASCAL    = CC_MSCPASCAL,
    CC_MACPASCAL    = CC_PASCAL + 1,
    CC_STDCALL    = CC_MACPASCAL + 1,
    CC_FPFASTCALL    = CC_STDCALL + 1,
    CC_SYSCALL    = CC_FPFASTCALL + 1,
    CC_MPWCDECL    = CC_SYSCALL + 1,
    CC_MPWPASCAL    = CC_MPWCDECL + 1,
    CC_MAX    = CC_MPWPASCAL + 1
    }    CALLCONV;


第四个参数:返回值类型
如果有返回值,就必须填写类型,是VT_VARANT声明相同的。如果没有返回值,就填入0值,就会忽略第八个参数的返回值。


第五个参数:参数总数
这个值必须正确了,参数总数不正确,会调用失败的,严重会出错退出。没参数时必须代入0。


第六个参数:参数类型数组
这个参数非常重要,如果类型写不正确,转代和调用时就会失败,参数变体型里的类型反倒不重要。


第七个参数:参数数组
其实就是变体型指针数组,但是DLL命令不能直接代入变体型数组,易会自动将变体型数组的成员数据,头尾相接的复制到连续存贮的内存块里,不是每个成员有独立的指针,这又和易的IDE不够智能有,勾选传址也没用。必须像例程里取出变体型数组指针代入。


第八个参数:返回值
代不代入没作用,由第四个参数决定,声明了返回值类型,就必须代入。


其实接口的调用,就看过例程后,触类旁通了。
希望教程对你有帮助,只是分享一些编程的小技巧。


动态调用函数.zip (14.64 KB, 下载次数: 13)
回复

使用道具 举报

已绑定手机
已实名认证
ghtuofzk
等级头衔

等級:编程菜鸟

Rank: 2

积分成就
易币
贡献
主题
精华
金钱
积分
71
注册时间
2022-11-12
最后登录
1970-1-1

勋章墙

2022-12-11 11:25:53 | 显示全部楼层

支持开源~!感谢分享
回复

使用道具 举报

如果懒得打字,请选择右侧内容快捷回复 提醒:以任何方式进行『恶意灌水』的行为,进行封号处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

热点推荐上一条 /5 下一条

QQ|网站地图|手机版|小黑屋|乐易论坛-乐易网 | 湘ICP备19007035号

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表乐易立场!

娄底市乐易网络科技有限公司声明:乐易原创培训课程版权均为我公司所有,未经许可,不得擅自翻录,盗版,破解本站课课程,我们将保留法律诉讼的权利

GMT+8, 2024-5-7 11:47 , Processed in 0.041695 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表