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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
技术宅的结界 门户 查看主题

任意参数回调的函数指针

发布者: tlwh163 | 发布时间: 2025-1-20 18:52| 查看数: 201| 评论数: 2|帖子模式

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

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

×
突然想的一个点子 不知道是否可行  我觉得这样连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
复制代码

最新评论

tlwh163 发表于 2025-1-20 18:55:41
  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
复制代码
gujin163 发表于 2025-1-21 10:27:51
啥也不说了,帖子就是带劲!

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

GMT+8, 2025-2-23 01:44 , Processed in 0.031120 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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