易语言ECallBack回调模块

易语言 2020-08-19 18:05:35

易语言ECallBack回调模块

.子程序 辅_生成_类回调_易, 整数型, 公开, [只能在类里调用]
.参数 函数序号, , , 从1开始,[_初始化][_销毁],[xx]
.参数 参数个数, , 可空
.参数 push_ecx, 逻辑型, 可空, 附加到第一个参数;默认为假
.参数 cdecl方式, 逻辑型, 可空, 默认为假
.局部变量 this
.局部变量 回调地址
.局部变量 data, 字节集
.局部变量 arg_length
.局部变量 sizeof_int
.局部变量 ret_len_WORD, 短整数型

this = 取指针内容_整数 (取上层函数首参 ())
回调地址 = 取_类_函数地址 (this, 函数序号)
.如果真 (回调地址 ≤ 0)
输出调试文本 (“[辅_生成_类回调_易][失败]:回调地址错误”)
返回 (0)
.如果真结束
sizeof_int = 4 ' #sizeof_int
.如果 (cdecl方式)
ret_len_WORD = 0
.否则
ret_len_WORD = 参数个数 × sizeof_int
.如果结束
arg_length = 参数个数 × sizeof_int
.如果真 (arg_length > 512 或 arg_length < 0)
输出调试文本 (“[辅_生成_类回调_易]局部变量长度错误”)
返回 (0)
.如果真结束
data = { }
data = data + { 85 } ' push ebp;
data = data + { 139, 236 } ' mov ebp,esp;
data = data + { 106 } + 到字节集_从字节 (ret_len_WORD) ' push [retn_size]; // [ebp-04]
data = data + { 83 } ' push ebx; // [ebp-8]
data = data + { 86 } ' push esi; // [ebp-0C]
data = data + { 87 } ' push edi; // [ebp-10]
data = data + { 106 } + { 0 } ' push 0; // [ebp-14]
data = data + { 217, 60, 36 } ' fstcw [esp];
data = data + { 219, 227 } ' finit;
data = data + { 104 } + 到字节集_从整数_ (this) ' push dwThis;
data = data + { 139, 196 } ' mov eax,esp
.如果真 (参数个数 ≠ 0)
data = data + { 185 } + 到字节集_从整数_ (arg_length) ' mov ecx,arg_length;
data = data + { 43, 225 } ' sub esp,ecx;
data = data + { 141, 117, 8 } ' lea esi,[ebp+8];
data = data + { 141, 60, 36 } ' lea edi,[esp];
data = data + { 252 } ' cld;
data = data + { 243, 164 } ' rep movsb;
data = data + { 139, 77, 248 } ' mov ecx,[ebp-8];
data = data + { 139, 117, 244 } ' mov esi.[ebp-C];
data = data + { 139, 125, 240 } ' mov edi,[ebp-10];
.如果真结束
.如果真 (push_ecx)
data = data + { 81 } ' push ecx;
.如果真结束
data = data + { 80 } ' push eax; // push &(this)
data = data + { 184 } + 到字节集_从整数_ (回调地址) ' mov eax,addr;
data = data + { 104 } + 到字节集_从整数_ (get_retn_code ()) ' push arg_1; //retn to static code
data = data + { 255, 224 } ' jmp eax
返回 (DumpCode (data))