gpt4 book ai didi

c++ - 如何用我自己的可靠地替换库定义的错误处理程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:51 27 4
gpt4 key购买 nike

在某些错误情况下,ATL 调用 AtlThrow()它被实现为 ATL::AtlThrowImpl() 依次抛出 CAtlException .后者不是很好 - CAtlException 甚至不是从 std::exception 派生的,而且我们使用我们自己的异常层次结构,现在我们必须捕获 CAtlException 在这里和那里分开,其中有很多额外的代码并且容易出错。

看起来可以用我自己的处理程序替换 ATL::AtlThrowImpl() - 定义 _ATL_CUSTOM_THROW 并将 AtlThrow() 定义为在包含 atlbase.h 之前成为自定义处理程序 - ATL 将调用自定义处理程序。

没那么简单。一些 ATL 代码不在源代码中——它编译为一个库——无论是静态的还是动态的。我们使用静态 - atls.lib。并且...它的编译方式使其内部具有 ATL::ThrowImpl() 并且有一些代码调用它。我使用了静态分析工具 - 它清楚地表明存在调用旧默认处理程序的路径。

为了确保我什至尝试在我的代码中“重新实现”ATL::AtlThrowImpl()。现在链接器说它看到了 ATL::AtlThrowImpl() 的两个声明,我想这证实了一些代码可以调用另一个实现。

我该如何处理?如何完全替换默认处理程序并确保从不调用默认处理程序?

最佳答案

我在写自己的内存管理器时遇到了类似的问题,想否决malloc和free。

问题是 ATL::AtlThrowImpl 可能是源文件的一部分,该源文件还包含真正需要的其他文件。

如果链接器在其中一个目标文件中看到对某个函数的引用,它会拉入具有该函数的目标文件,包括同一目标文件中的所有其他函数。

解决方案是查找定义了 ATL::AtlThrowImpl 的 ATL 源代码,看看该源代码是否包含其他函数。您还需要实现其他功能以防止链接器引用原始 ATL 源代码。

关于c++ - 如何用我自己的可靠地替换库定义的错误处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2468161/

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