当调用以回调为参数的WinAPI函数时,通常会有一个特殊的参数将一些任意数据传递给回调。如果没有这样的事情(例如SetWinEventHook
),我们可以理解导致给定回调调用的API调用中的哪个唯一方法就是具有不同的回调。当我们知道在编译时调用给定API的所有情况时,我们总是可以使用静态方法创建一个类模板,并在不同的调用端使用不同的模板参数实例化它。那真是一件麻烦事,我不喜欢这样做。
如何在运行时创建回调函数,以便它们具有不同的函数指针?
我看到了一个生成运行时程序集的解决方案(很抱歉,俄语),但是它不能在x86 / x64体系结构中移植。
您可以使用libffi的闭包API。它允许您创建每个具有不同地址的蹦床。我在这里实现了一个包装类,尽管还没有完成(仅支持int
参数和返回类型,您可以专门detail::type
提供支持,而不仅仅是int
)。LLVM是更重量级的替代方法,尽管如果仅处理C类型,libffi会做的很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句