Project1

标题: 纯脚本不使用DLL就读取窗口消息 [打印本页]

作者: 晴兰    时间: 2011-12-21 15:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小白玩家    时间: 2011-12-21 15:35
我不知道,这个功能是什么,可以详细解释下吗,还有为什么发到水区了呢
作者: 晴兰    时间: 2011-12-21 15:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: dbshy    时间: 2011-12-21 15:50
炫耀贴滚粗
又来了一个跟秀秀 紫苏一样级别的高手
作者: yangff    时间: 2011-12-21 22:20
本帖最后由 yangff 于 2011-12-21 22:21 编辑

炫汇编的……对了ace支持dl了亲~
作者: 各种压力的猫君    时间: 2011-12-21 22:22
触手越来越多了
作者: 1243852    时间: 2011-12-21 22:29
伸手党有福了。
作者: yangff    时间: 2011-12-21 23:08
可以callback吧……
作者: 晴兰    时间: 2011-12-21 23:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2011-12-21 23:14
晴兰 发表于 2011-12-21 23:10
需要require 'dl.so' 而这个现在看是不怎么可能的T_T
只能:
DL:: CPtr

DL:: CFunc
这个就够了,Callback只是封装了一下
作者: 晴兰    时间: 2011-12-21 23:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2011-12-21 23:18
晴兰 发表于 2011-12-21 23:16
哦哦 原来如此 那也行 这个可以当C函数指针用
不过直接用RGSS3的Ruby写回调还是麻烦T_T ...

  1. module DL
  2.   SEM = Mutex.new



  3.   def set_callback_internal(proc_entry, addr_entry, argc, ty, abi = nil, &cbp)
  4.     if( argc < 0 )
  5.       raise(ArgumentError, "arity should not be less than 0.")
  6.     end
  7.     addr = nil


  8.       SEM.synchronize{
  9.         ary = proc_entry[ty]
  10.         (0...MAX_CALLBACK).each{|n|
  11.           idx = (n * DLSTACK_SIZE) + argc
  12.           if( ary[idx].nil? )
  13.             ary[idx] = cbp
  14.             addr = addr_entry[ty][idx]
  15.             break
  16.           end
  17.         }
  18.       }

  19.     addr
  20.   end

  21.   def set_cdecl_callback(ty, argc, &cbp)
  22.     set_callback_internal(CdeclCallbackProcs, CdeclCallbackAddrs, argc, ty, &cbp)
  23.   end

  24.   def set_stdcall_callback(ty, argc, &cbp)

  25.       set_callback_internal(StdcallCallbackProcs, StdcallCallbackAddrs, argc, ty, &cbp)

  26.   end

  27.   def remove_callback_internal(proc_entry, addr_entry, addr, ctype = nil)


  28.       index = nil
  29.       if( ctype )
  30.         addr_entry[ctype].each_with_index{|xaddr, idx|
  31.           if( xaddr == addr )
  32.             index = idx
  33.           end
  34.         }
  35.       else
  36.         addr_entry.each{|ty,entry|
  37.           entry.each_with_index{|xaddr, idx|
  38.             if( xaddr == addr )
  39.               index = idx
  40.             end
  41.           }
  42.         }

  43.       if( index and proc_entry[ctype][index] )
  44.         proc_entry[ctype][index] = nil
  45.         return true
  46.       else
  47.         return false
  48.       end
  49.     end
  50.   end

  51.   def remove_cdecl_callback(addr, ctype = nil)
  52.     remove_callback_internal(CdeclCallbackProcs, CdeclCallbackAddrs, addr, ctype)
  53.   end

  54.   def remove_stdcall_callback(addr, ctype = nil)
  55.     remove_callback_internal(StdcallCallbackProcs, StdcallCallbackAddrs, addr, ctype)
  56.   end

  57.   alias set_callback set_cdecl_callback
  58.   alias remove_callback remove_cdecl_callback
  59. end
复制代码
没测试过
作者: 晴兰    时间: 2011-12-21 23:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2011-12-22 00:06
晴兰 发表于 2011-12-21 23:20
新人先把大大的代码复制下来学习中

object_id???
作者: 鑫晴    时间: 2013-8-24 14:03
看不懂..




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1