【问题标题】:Adding #include <boost/thread/mutex.hpp> breaks my ActiveX control?添加 #include <boost/thread/mutex.hpp> 会破坏我的 ActiveX 控件?
【发布时间】:2011-07-18 09:00:56
【问题描述】:

在 ActiveX 控件中使用 boost::mutex 标头是否存在已知问题?
(Boost 版本 v1.39)

如果我在 Visual Studio 2008 中创建一个名为 "DefaultOCXControl"MFC ActiveX 控件 项目,那么我可以构建它,该控件将自身注册为构建的一部分,并且可以按照您的预期插入到 ActiveX 测试容器中。都很好。

如果我再添加这一行:

#include <boost/thread/mutex.hpp>

在我的DefaultOCXControlCtrl.h 文件顶部并重新构建:构建结束时的注册步骤失败:

调试断言失败!
程序:C:\Windows\system32\regsvr32.exe
文件:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dllinit.cpp
线路:587

有问题的断言如下所示:

void AFXAPI AfxCoreInitModule()
{
    ASSERT(AfxGetModuleState() != AfxGetAppModuleState());
    ...

现在尝试将控件插入 ActiveX 测试容器会产生相同的消息。如果我删除该行并重建,那么一切都很好 - 所以它肯定似乎是那个头文件中的某些东西导致了这个问题。

【问题讨论】:

    标签: c++ visual-c++ boost mfc activex


    【解决方案1】:

    您是否尝试过动态链接boost::thread(定义BOOST_THREAD_DYN_LINK)?

    我在将boost::thread 与混合 C++/.NET 项目一起使用时遇到了此类问题,并且仅动态链接 boost::thread 是解决方案(这里可能的解释是:http://article.gmane.org/gmane.comp.lib.boost.user/22617/match=clr

    【讨论】:

    • 谢谢。这是最终的解决方案。显然 boost::thread 和 MFC 存在一个已知问题,因为它们都挂起 _pRawDllMain 的清理功能,在此处的 boost 邮件存档中讨论:lists.boost.org/threads-devel/2009/06/0476.php 我迁移了使用 boost::thread 的静态库改为 DLL,从而解决了问题。
    【解决方案2】:

    从 Boost 1.52 开始,您可以尝试将这一行添加到您的代码中,尤其是如果您更喜欢静态链接:

    #include <boost/thread/win32/mfc_thread_init.hpp>
    

    来源:Boost Ticket 8550

    【讨论】:

    • 使用 boost 1.55 和 VS2013 就像一个魅力。
    • 我应该把这条线放在哪里?
    • @user1633272 如果我没记错的话,这并不重要,只要它被编译成遇到问题的二进制文件即可。
    • 我应该将它包含在 dll 项目中还是使用 dll 的项目中?目前我有一个 EasyHook dll 项目 B,它依赖于 MFC 静态库项目 A(在共享 DLL 中使用 MFC),我在项目 B 中添加了这一行,但不起作用。又出现一个错误:LNK2005 _DllMain@12 已在 MSVCRTD.lib(dll_dllmain_stub.obj) 中定义
    • 根据链接的 Boost Ticket 将其添加到您的 DLL 就足够了。如果没有,那么这个解决方案可能不适合你,抱歉。
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2014-09-10
    • 2018-12-28
    • 2015-02-08
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多