兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜

转自:http://read.newbooks.com.cn/info/42.html

CString的Release函数实现如下:

void CString::Release()

    
if (GetData() != _afxDataNil) 
    { 
        ASSERT(GetData()
->nRefs != 0);
        
if (InterlockedDecrement(&GetData()->nRefs) <= 0
            FreeData(GetData()); 
        Init();
    }
}
其中_afxDataNil定义如下:
AFX_STATIC_DATA int _afxInitData[] = { -1000 };
AFX_STATIC_DATA CStringData
* _afxDataNil = (CStringData*)&_afxInitData;

sizeof(CString)等于4,它是一个指针。对于空的CString,MFC会让其指向一个静态数据_afxInitData。MFC通过判断CString的值是否等于_afxInitData的地址来判断CSting是否是空的。

如果在exe和dll之间传递CString对象,而exe和dll都与MFC静态链接,那么在exe和dll中的_afxInitData的地址可能是不同的。exe中的空CString传到dll中会被当成非空CString处理,然后就会发生错误。

一般而言,如果不是动态链接MFC类库,应尽量避免在exe和dll之间传递MFC的对象。

posted on 2010-06-01 11:11 会飞的兔子 阅读(355) 评论(1)  编辑 收藏 引用 所属分类: C++及开发环境

Feedback

# re: CString的一个问题 2010-06-01 12:29 战魂小筑
无论MFC还是其他对象,在DLL间互现传递都必须重新拷贝构造  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理