我正在使用一些全局数据创建一个C++ Win32 dll。有一个std::map是全局定义的,dll中有导出的函数将数据写入映射(当然是在获得写锁之后)。
我的问题是,当我从dll DllMain内部调用写函数时,它没有出现任何问题。但是,当我从另一个程序加载dll并调用将数据写入全局映射的函数时,它会给出以下错误:
WindowsError: exception: access violation reading 0x00000008有什么可以做的吗?当从DllMain调用相同的函数时,它可以访问dll中的全局数据,但是当从不同的进程调用时,它不能访问全局数据。请指点。
我正在使用TDM-MinGW gcc 4.4.0编译器.
编辑: Ok,我已经知道问题出在哪里了,谢谢大家的帮助,但问题不是构造函数问题,也不是无法在全局空间中得到映射,而是我正在使用的boost::中的一个问题。我已经对它进行了测试,但是由于我是从python内部调用dll或其他什么的,所以urllib2模块没有加载到dll中。现在我得看看怎么解决它。
发布于 2009-07-29 09:07:05
看起来,当您的代码被调用时,std::map的构造函数尚未运行。在Win32 DLL中,全局非荚的生命周期非常棘手,我不确定MinGW是如何具体处理它的。但是,这可能是您编译DLL的方式,您已经设置了自己的函数(DllMain?)作为入口点,从而覆盖调用构造函数的CRT初始化例程。
发布于 2009-07-30 01:47:07
这样低内存地址的读取错误通常意味着您试图访问某个地方的空指针。你能出示你的实际代码吗?
发布于 2009-07-29 09:07:34
您必须使用共享内存,因为不同的进程有不同的地址空间。我想你不会得到std::地图运行。我建议使用MapViewOfFile,CreateFileMapping,OpenFileMapping,.和普通的旧数据。问问Google / MSDN。
https://stackoverflow.com/questions/1198893
复制相似问题