Q: 在 lua 中创建一个 hookfunction

我想在 lua 中创建一个 hookfunction:

为了解释,我想在函数被调用时挂接参数并返回参数,像这样:

function func1(x, y)
  print(tonumber(x) + tonumber(y))
end

a = hookfunction(func1, function(...)    -- a = 旧函数
  local args = { ... }
  print("Argument 1 =>", args[1])
  print("Argument 2 =>", args[2])
  return a(...)
end)

func1(12, 5)
输出:

Argument 1 => 12
Argument 2 => 5
17
点赞
用户7509065
用户7509065

有两种不同的方法可以处理。你可以为该函数创建一个包装器(wrapper),或者实际上在 Lua 运行时设置一个调试钩子(debugging hook)。下面是你如何创建一个包装器:

function func1(x, y)
  print(tonumber(x) + tonumber(y))
end

function wrapfunction(a)    -- a = old function
  return function(...)
    local args = { ... }
    print("Argument 1 =>", args[1])
    print("Argument 2 =>", args[2])
    return a(...)
  end
end
func1 = wrapfunction(func1)

func1(12, 5)

而下面是如何设置调试钩子:

function func1(x, y)
  print(tonumber(x) + tonumber(y))
end

function hookfunction(event)
  if debug.getinfo(2, 'f').func == func1 then
    print("Argument 1 =>", select(2, debug.getlocal(2, 1)))
    print("Argument 2 =>", select(2, debug.getlocal(2, 2)))
  end
end
debug.sethook(hookfunction, 'c')

func1(12, 5)
2020-05-20 02:37:40
用户2828480
用户2828480

你可以尝试这个

function func1(x, y)
  print(tonumber(x) + tonumber(y))
end

oldfunc1 = func1

function func1hook(x, y)
  print("Argument x =>", x)
  print("Argument y =>", y)
  return oldfunc1(x, y)
end

func1 = func1hook

func1(4,4)

我不确定这是否适用于C函数,但你可以试试。如果想要更通用的hook函数也是可能的。

https://www.lua.org/cgi-bin/demo

2020-05-20 08:36:30