странное поведение с CString MFC - PullRequest
0 голосов
/ 23 октября 2011

Я получаю странное поведение памяти, используя строку 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++

, тогда значение верное.есть идеи в чем проблема ?!я полностью в тупике.любая помощь будет принята с благодарностью!спасибо.

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Оказывается, что адреса strSrc и m_pRunPCD-> m_PCD_Dir были смещены на 1, из-за чего указатель буфера был недействительным.Оказывается, я неправильно включил упаковку в заголовочном файле, чтобы решить другую проблему, которая привела к этой проблеме.

1 голос
/ 23 октября 2011

Вместо:

PCD_Dir = m_pRunPCD->m_PCD_Dir;

попробуйте:

PCD_Dir = (LPCTSTR) m_pRunPCD->m_PCD_Dir;
...