gpt4 book ai didi

c++ - 覆盖 CRT 的 _purecall 实现

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:29 25 4
gpt4 key购买 nike

我目前正在开发一个 DLL,它是一个封闭的工作项目的扩展。

我想找出每一个纯调用错误,所以我用谷歌搜索并找到了 _purecall 处理程序。我的问题是关于它的实现。幕后发生了什么?编译器本身获取我的处理程序函数地址(如果我定义了一个)并在它被类函数地址本身(初始化后)覆盖之前将其默认值写入 v 表中的每一行,或者更复杂的东西,涉及CRT 和全局指针?

我问这个是因为我当然不希望我的插件 DLL 覆盖整个应用程序 _purecall 处理程序。我可以确定我的 purecall 处理程序将只处理我模块中的 purecall 吗?

谢谢!

最佳答案

答案在很大程度上取决于您的编译器如何实现 purecall 处理程序。如果编译器只是替换了虚函数表中的“纯”函数指针,那么您就可以安全地修改父进程行为。

但一些编译器通过从 CRT 的处理程序调用您的处理程序来实现自定义 purecall 处理程序。在这种情况下,行为将取决于您构建 DLL 的方式。如果您已经静态链接到 CRT,那么您的 DLL 将拥有自己的所有 CRT 状态的实例。在这种情况下,编译器实现无关紧要。您的 purecall 处理程序不会干扰父进程。

另一方面,如果您已动态链接到 CRT,则行为将取决于宿主进程的构建方式。如果它动态链接到与您的 DLL 相同版本的 CRT,那么您的 purecall 处理程序确实会干扰。但这又取决于编译器的实现。即使它从 CRT 调用您的 Hook ,如果 CRT 为每个模块维护不同的 Hook ,您可能是安全的。

在任何情况下,如果您想确保安全,那么您必须将 DLL 静态链接到 CRT 或避免使用 purecall 处理程序(替代方法是使用具体基类而不是抽象基类)。

关于c++ - 覆盖 CRT 的 _purecall 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com