读书人

当C++的静态成员巧遇DLL。

发布时间: 2012-09-29 10:30:01 作者: rapoo

当C++的静态成员邂逅DLL。。。
基类作为一个公共模块,exe和dll均有定义,其中有个成员:m_SharedObj,dll定义了一个子类,在exe中给这个成员初始化并赋值后,调试发现,在dll中的m_SharedObj仍为空,并且两者地址也不同。。。这个跟CPP标准是不是冲突了呢?调试环境:WinXP+VS2008

[解决办法]
只要指针指向正确的地址,是可以共享的. 你最好是调试看看,是哪里出了问题.
[解决办法]
所以啊,珍惜生命,远离扩展dll,只使用纯C接口的标准dll。
[解决办法]
基类作为一个公共模块,exe和dll均有定义,其中有个成员:m_SharedObj

问题出在这里

请确定m_SharedObj对于DLL是否为导出,对于exe是否为导入。
[解决办法]

探讨

基类作为一个公共模块,exe和dll均有定义,其中有个成员:m_SharedObj

问题出在这里

请确定m_SharedObj对于DLL是否为导出,对于exe是否为导入。

[解决办法]
dll不共享变量,所有加载dll的进程,会拷贝一份实例

如果你要共享变量,把变量加到共享数据段里面去

ps. dll只是作为共享代码用的,而且,dll里面写类。。这个,会迟早出事
[解决办法]
反对5L意见"dll里面写类。。这个,会迟早出事",不解释。
[解决办法]
探讨

引用:

反对5L意见"dll里面写类。。这个,会迟早出事",不解释。


请看腾讯的common.dll,里面一大堆导出类

[解决办法]
1. 使用规则来规避错误.
2. 了解细节来规避错误.
很明显你不满足2号条件
[解决办法]
导出类因为陷阱太多,所以才建议不要用。你没有腾讯那么多人力去越过这么多陷阱。

读书人网 >C++

热点推荐