我正在用一些全局数据创建一个 C++ Win32 dll。有一个全局定义的 std::map 并且在 dll 中有导出函数将数据写入映射(当然是在获取写锁之后)。
我的问题是,当我从 dll DllMain 内部调用 write 函数时,它可以正常工作。但是当我从另一个程序加载 dll 并调用将数据写入全局映射的函数时,它给了我这个错误:
WindowsError: exception: access violation reading 0x00000008
有什么办法可以解决这个问题吗?从 DllMain 调用时,相同的函数可以访问 dll 中的全局数据,但是当从不同的进程调用时,它不能访问全局数据。请指教。
我正在使用 TDM-MinGW gcc 4.4.0 编译器。
编辑: 好的,我已经弄清楚问题是什么,并感谢您的帮助,但问题不是构造函数问题或无法在全局空间中拥有 map ,而是 boost::python 中的问题使用。我已经对其进行了测试,但是由于我是从 python 或其他东西中调用 dll,所以 urllib2 模块没有加载到 dll 中。现在我必须看看如何修复它。
最佳答案
调用您的代码时,std::map
的构造函数似乎尚未运行。 Win32 DLL 中全局非 POD 的生命周期非常棘手,我不确定 MinGW 如何具体处理它。但可能是您编译 DLL 的方式将您自己的函数 (DllMain
?) 设置为入口点,从而覆盖了调用构造函数的 CRT 初始化例程。
关于c++ - 从导出的 dll 函数访问 dll 中的全局数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198893/