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

时间:2009-07-29 08:58:14

标签: c++ winapi dll tdm-mingw

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

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

WindowsError: exception: access violation reading 0x00000008

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

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

修改 好吧,我已经弄清楚问题是什么了,感谢帮助人员,但问题不在于构造函数问题或者无法在全局空间中创建地图,而是在boost :: python中的问题我是使用。我测试过它,但是因为我是从python中调用dll或者是某些东西,所以urllib2模块没有被加载到dll中。现在我必须看看如何解决它。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您必须使用共享内存,因为不同的进程具有单独的地址空间。 我想你不会让std :: map运行。我建议使用MapViewOfFile,CreateFileMapping,OpenFileMapping,...和普通旧数据。问谷歌/ MSDN。