MFC的CString的奇怪行为

strange behavior with MFC's CString

本文关键字:CString MFC      更新时间:2023-10-16

我使用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++

memory (from watch window):

(wchar_t**)&(m_pRunPCD->m_PCD_Dir): 
0x007ec270  wchar_t * *
m_pRunPCD->m_PCD_Dir.m_pszData:
0x007ee8a0 "C:ProgramDataWAIPC-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++

则值正确。知道是什么问题吗?!我完全被难住了。任何帮助将非常感激!谢谢。

而不是:

PCD_Dir = m_pRunPCD->m_PCD_Dir;

试题:

PCD_Dir = (LPCTSTR) m_pRunPCD->m_PCD_Dir;

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