1

我正在使用一些全局数据创建一个 C++ Win32 dll。全局定义了一个 std::map ,并且 dll 中有将数据写入映射的导出函数(当然,在获取写锁之后)。

我的问题是,当我从 dll DllMain 内部调用 write 函数时,它可以正常工作。但是当我从另一个程序加载 dll 并调用将数据写入全局映射的函数时,它给了我这个错误:

WindowsError: exception: access violation reading 0x00000008

有什么可以做的吗?当从 DllMain 调用时,相同的函数可以访问 dll 中的全局数据,但是当从不同的进程调用时,它无法访问全局数据。请指教。

我正在使用 TDM-MinGW gcc 4.4.0 编译器。

编辑: 好的,我已经弄清楚了问题所在,感谢各位的帮助,但问题不在于构造函数问题或无法在全局空间中拥有地图,而是我在 boost::python 中的问题正在使用。我已经对其进行了测试,但是由于我是从 python 或其他东西中调用 dll,所以 urllib2 模块没有被加载到 dll 中。现在我必须看看如何解决它。

4

3 回答 3

1

调用您的代码时,看起来构造函数std::map尚未运行。Win32 DLL 中全局非 POD 的生命周期非常棘手,我不确定 MinGW 如何具体处理它。但这可能是您编译 DLL 的方式,您将自己的函数 ( DllMain?) 设置为入口点,从而覆盖了调用构造函数的 CRT 初始化例程。

于 2009-07-29T09:07:05.303 回答
1

在如此低的内存地址出现读取错误通常意味着您正试图在某处访问 NULL 指针。你能显示你的实际代码吗?

于 2009-07-30T01:47:07.010 回答
0

你必须使用共享内存,因为不同的进程有不同的地址空间。我认为您不会运行 std::map 。我会推荐使用 MapViewOfFile、CreateFileMapping、OpenFileMapping... 和普通的旧数据。询问谷歌/MSDN。

于 2009-07-29T09:07:34.087 回答