c++boost asio异步函数在dll中不起作用
c++ boost asio asynchronous functions wont work inside dll
我有一个基于教程的简单的boost asio代码,当从exe中调用时运行良好,但当使用LoadLibrary从dll中运行时崩溃。它在boost代码而不是我的代码中崩溃。90%的时间它都会在线程互斥函数内部崩溃。与exe相比,在dll中执行代码时是否有任何限制?
这是我的代码:
Connection::Connection(boost::asio::io_service& ioservice)
: m_Socket(ioservice)
, m_Resolver(ioservice)
{
}
void Connection::ConnectTo()
{
boost::asio::ip::tcp::resolver::query query("www.google.com", "http");
boost::asio::ip::tcp::resolver::iterator iterator = m_Resolver.resolve(query);
boost::asio::ip::tcp::endpoint endpoint = *iterator;
// crashes here inside async_connect
m_Socket.async_connect(endpoint,
boost::bind(&Connection::HandleConnect, shared_from_this(),
boost::asio::placeholders::error, ++iterator));
}
void Connection::HandleConnect( const boost::system::error_code& e,
boost::asio::ip::tcp::resolver::iterator endpoint_iterator )
{
// never reaches here
}
这段代码会在dll而不是exe中崩溃,有什么原因吗?请注意,只有异步调用才会崩溃。同步呼叫工作正常
感谢
一些boost库(已编译的库)在内部使用全局状态。当您仅从可执行文件中使用boost时,这不是问题,因为您只获得全局变量的一个副本。当你加载一个也使用boost的DLL时,你会得到全局状态的另一个副本,这会导致不可预测的行为。
要解决此问题,请动态链接到boost(编译DLL版本并在DLL和EXE中定义boost_ALL_DYN_link)。这样,您将在内存中只获得全局状态的一个副本。
在静态链接库中工作的DLL函数崩溃的一个典型原因是内存管理器。DLL将获得它自己的内存管理器副本,除非您在任何地方动态链接RTL。因此,每个跨越边界的对象都必须用它创建的内存管理器进行销毁,否则销毁此类对象会导致崩溃。
相关文章:
- C++/CLI 混合托管/本机 DLL 不起作用
- 可视C++:XGBoost 从 DLL 调用时不起作用
- PlayFunction在DLL中不起作用,但在独立的exe中工作
- DLL函数在VBA环境中不起作用,但在Excel VBA中工作
- 将 DLL 附加到托管进程不起作用
- 在 DLL 中使用时,运行代码不起作用
- boost::从 DLL 调用时日志格式不起作用
- 在 Windows 8 中编译的 DLL 在 Windows 7 中不起作用
- 编译错误libgcc_s_dw2-1.dll缺少任何内容都不起作用
- 64位DLL中的CreateThread不起作用
- 将DLL与python一起使用(使用ctypes),不起作用
- GetFullPathNameA的Dll注入不起作用
- 注入dll在windows XP上不起作用
- C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用
- 在Windows 7下编译的Dll在Windows XP中不起作用
- 线程对象的 WaitForSingleObject 在 DLL 卸载中不起作用
- 这个简单的C++ DLL 在 C# 中不起作用
- win32 DLL中的C++-LoadString()不起作用
- PostMessage(),SendMessage 在 ATL dll 中不起作用(事件处理)
- 在Windows CE上安装CAB时,安装DLL不起作用