找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 34|回复: 2

任意参数回调的函数指针

[复制链接]
发表于 前天 18:52 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
突然想的一个点子 不知道是否可行  我觉得这样连cdecl的函数 我都敢去调用 只要参数不超过10个。。。

  1.     Asm          '这个可以支持多达10个参数的任意回调函数(回调函数的参数数量可以随意)
  2.         push ebp  ;  mov ebp, esp  ;  Sub esp, 16 + 40
  3.         
  4.         mov  DWORD Ptr [ebp - 16], eax      '保存eax
  5.         mov  DWORD Ptr [ebp - 12], ecx      '保存ecx
  6.         mov  DWORD Ptr [ebp -  8], esi      '保存esi
  7.         mov  DWORD Ptr [ebp -  4], edi      '保存edi
  8.         
  9.         lea  edi, [esp +  0]        
  10.         lea  esi, [ebp + 12]
  11.         mov  ecx, 10                        '复制 10个参数到 新开的栈区
  12.         rep  movsd

  13.         lea  edi, [ebp + 12]
  14.         mov  ecx, 10                        '置零 10个参数的 栈空间
  15.         mov  eax, 0
  16.         rep  stosd
  17.         
  18.         mov  eax, DWORD Ptr [ebp - 16]      '还原eax
  19.         mov  ecx, DWORD Ptr [ebp - 12]      '还原ecx
  20.         mov  esi, DWORD Ptr [ebp -  8]      '还原esi
  21.         mov  edi, DWORD Ptr [ebp -  4]      '还原edi
  22.         
  23.         Call DWORD Ptr [ebp + 8]            '调用 回调函数
  24.         
  25.         mov  esp, ebp  ;  pop ebp  ;  ret 44
  26.     End Asm
复制代码
回复

使用道具 举报

 楼主| 发表于 前天 18:55 | 显示全部楼层
  1. 'Dim FAddr As Long : FAddr = Cast(Long, @ANY_FUNC)
  2. 'Print "调用 CallWindowProc ", CallWindowProcW(Cast(any Ptr, FAddr), Cast(hWnd, 1), 2, 4, 8)
  3. 'Print "调用 VB6_CALLBACK   ", VB6_CALLBACK(FAddr, 1, 2, 4, 8)
  4. Function ANY_FUNC(a1 As Long, a2 As Long, a3 As Long, a4 As Long) As Long
  5.     Return (a1 + a2 + a3 + a4)
  6. End Function
复制代码
回复 赞! 靠!

使用道具 举报

发表于 昨天 10:27 | 显示全部楼层
啥也不说了,帖子就是带劲!
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2025-1-22 13:54 , Processed in 0.033486 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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