c++ - 从导出的 dll 函数访问 dll 中的全局数据

标签 c++ winapi dll tdm-mingw

我正在用一些全局数据创建一个 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/

相关文章:

c++ - Qtwebengine进程在应用程序关闭后没有关闭

c++ - 使用 SetThreadAffinityMask() 动态选择要运行的线程

c++ - 通过鼠标钩子(Hook)激活鼠标下的窗口

dll - VBScript - 使用未注册的 DLL

mysql - 通过Visual C++ DLL通过局域网访问本地MySQL数据库

c++ - 使用 DirectShow 捕获数字电视时遇到问题

python - 设置嵌入式 Python 以编写 C++ 游戏脚本

c++ - 使用带有 '>>' 运算符的 std::istringstream 的奇怪行为

windows - 如何在 Win32 中自定义选项卡控件的外观?

java - 当我不能时,Maven 正在执行什么样的魔法来运行这个项目?