MFC 的 CString 的奇怪行为

Posted

技术标签:

【中文标题】MFC 的 CString 的奇怪行为【英文标题】:strange behavior with MFC's CString 【发布时间】:2011-10-22 21:30:22 【问题描述】:

我正在使用 MFC CString 获得最奇怪的内存行为:

第 138 行:PCD_Dir = m_pRunPCD->m_PCD_Dir;

声明:

CString PCD_Dir; (file scope, defined as a global outside of CServer )

class CRunPCD 

public:
CString m_PCD_Dir;

调用堆栈:

Support.dll!CServer::Init(CCfcController * pv=0x007ebe78)  Line 138 C++
Support.dll!CCfcController::OnInitialUpdate()  Line 156 + 0xf bytes C++
Support.dll!CCfcApp::CCncApp()  Line 140    C++
Support.dll!newInstance()  Line 162 + 0x2c bytes    C++

内存(来自观察窗口):

(wchar_t**)&(m_pRunPCD->m_PCD_Dir): 
0x007ec270  wchar_t * *

m_pRunPCD->m_PCD_Dir.m_pszData:
0x007ee8a0 "C:\ProgramData\WAI\PC-DMIS\"    wchar_t *

(wchar_t**)&PCD_Dir:
0x068f4698 class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > PCD_Dir    wchar_t * *

PCD_Dir.m_pszData:
0x789cb8f8 ""   wchar_t *

然后我进入作业,我的环境如下所示:

代码:

// Assignment operators
CStringT& operator=(_In_ const CStringT& strSrc)

CThisSimpleString::operator=( strSrc );
return( *this );

调用堆栈:

mfc100ud.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::operator=(const ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > & strSrc=<Bad Ptr>)  Line 1218    C++
Support.dll!CServer::Init(CCfcController * pv=0x007ebe78)  Line 141 C++
Support.dll!CCfcController::OnInitialUpdate()  Line 156 + 0xf bytes C++
Support.dll!CCfcApp::CCncApp()  Line 140    C++
Support.dll!newInstance()  Line 162 + 0x2c bytes    C++

内存:

&strSrc 
0x007ec269 const ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > *

strSrc.m_pszData:
0xff000000 <Bad Ptr>    wchar_t *

所以由于某种原因,值没有正确传递......? 有趣的是,如果看看这个框架:

CNCSupport.dll!CServer::Init(CCncController * pv=0x007ebe78)  Line 141  C++

那么这个值是正确的。 知道问题是什么吗?!我完全被难住了。任何帮助将不胜感激!谢谢。

【问题讨论】:

【参考方案1】:

代替:

PCD_Dir = m_pRunPCD->m_PCD_Dir;

尝试:

PCD_Dir = (LPCTSTR) m_pRunPCD->m_PCD_Dir;

【讨论】:

这会产生与上面相同的结果【参考方案2】:

原来strSrc和m_pRunPCD->m_PCD_Dir的地址偏移了1,这就是缓冲区指针无效的原因。原来我错误地启用了在头文件中打包以解决导致此问题的另一个问题。

【讨论】:

您应该始终将系统标头作为源文件中的第一件事,在您的本地包含或任何其他指令之前。这将使事情保持一致。

以上是关于MFC 的 CString 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

通过COM创建多个MFC对话框,奇怪的行为

直接在 swscanf 中使用 CString 的奇怪行为

EnumWindows 奇怪的行为

Visual Studio 2008中字符串头文件不是cstring是string?

使用 WinXp 常用控件时编辑控件背景颜色的奇怪行为

VS2010-MFC(MFC常用类:CString类)