如何hook已有函数

 我来答
蔷观九382
2016-12-22 · 超过191用户采纳过TA的回答
知道小有建树答主
回答量:463
采纳率:0%
帮助的人:172万
展开全部
从LUA的文档来看: The statement function f () ... end translates to f = function () ... end 那意味着任意一个函数能被其它的任意一个函数通过一个简单的分配所替代.把这个记在心里,它将变得很容易去“Hook”,或者是添加你自己的函数到一个预先定义好的函数中. # Hook 有钩住,钩子的意思. 警告:这个部分包含过时的信息.比如说我们想显示那些我们级别高很多的玩家和怪的级别来替代骷髅.隐藏级别的函数是TargetFrame_CheckLevel(),因此我们需要hook那个函数来让它不要隐藏级别. 让我们假设我们的插件被命名为"MyAddOn",并且有一个OnLoad处理器被它的XML 事件所调用.在Lua的文档中我们应该有: local MyAddOn_Orig_TargetFrame_CheckLevel; function MyAddOn_OnLoad() MyAddOn_Orig_TargetFrame_CheckLevel = TargetFrame_CheckLevel; -- 存储原始的函数 TargetFrame_CheckLevel = MyAddOn_TargetFrame_CheckLevel; -- Hook进我们的 end 因此上面所做的就是它存储原始"TargetFrame_CheckLevel" 的参量到"MyAddOn_Orig_TargetFrame_CheckLevel".接着它用我们的函数替换了原始的,因此现在任何人调用TargetFrame_CheckLevel()时实际上得到的是被MyAddOn_TargetFrame_CheckLevel()所替代的. 下一步就是创建我们的MyAddOn_TargetFrame_CheckLevel().让我们假设我们想要它显示目标的级别. function MyAddOn_TargetFrame_CheckLevel() local retval = MyAddOn_Orig_TargetFrame_CheckLevel(); -- 调用原始的函数 TargetLevelText:Show(); TargetHighLevelTexture:Hide(); return retval; end 因此在这个函数中,我们首先调用老的函数让它做它必需做的.接着,显示级别并且隐藏骷髅.非常简单不是吗? 这只是一个怎么样hook的例子,它不是真的为你显示级别. --影子而矣 很容易就能Hook一个函数吗? 如你有Sea库,那么你能hook一个函数用Sea.util.hook. Sea.util.hook("OldFunctionName", "NewFunctionName", "before|after|hide|replace"); 如果你指明代替,那么老的函数将只在新的函数返回真时被调用. 如果你使用Sea.util.hook,那么你也能在此过后用Sea.util.unhook移去hook. Sea.util.unhook("OldFunctionName, "NewFunctionName"); 使用Sea.util.hook 要小心参数的传递,优先权,链接并且你能确保在此过后你能清掉这些. 有选择的使用Sea 如果你不想你的插件依赖Sea,但是你又想当它可用时获益,你可以检测它的存在: local MyAddOn_Old_FunctionToHook = function() end; if Sea then Sea.util.hook("FunctionToHook", "ReplacementFunction", "after"); else MyAddOn_Old_FunctionToHook = FunctionToHook; FunctionToHook = ReplacementFunction; end function ReplacementFunction() MyAddOn_Old_FunctionToHook(); ... end 这些编码允许你在你的TOC中列出Sea做为一个OptionalDep.这能帮你防止将来用户安装Sea时其它的插件完全替换老的函数所引起的冲突.
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式