-1
我移植32位應用程序的64位MFC應用到64位內置於VC++。淨2003。我已經在內建了這個應用程序VS2010 sp1成功在32位和64位平臺。但我面臨的應用程序崩潰問題在64位平臺(x64)應用程序,但不在32位平臺(win32)。崩潰是在belowcode線移植32位到在窗口7
char *pSls = (char*)SendMessage(::GetParent(::GetParent(GetParen())),
m_uMessageID,
L_SOM_CHANNEL, nChannel);
發生在的Win32 * PSLS獲取數據,但在64位,表達不評估。 我觀察到SendMessage的返回類型是LRESULT,這是一個LONG_PTR和LONG_PTR很長的Win32和_int64在64位平臺上。 任何人都可以請幫忙解決問題嗎?
這是displaiying實際的錯誤: 表達:IsBadReadPtr((常量無效)(pszString)的sizeof((pszString)))
請找到更多的代碼:
int CMNEditInputTab::GetChanIndx(const int nChannel)
{
MEMBERASSERT();
char *pSls = (char *)SendMessage(::GetParent(::GetParent(GetParent())),
m_uMessageID,
L_SOM_CHANNEL, nChannel);
if (*pSls == NULL)
return 0;
int nIndex = GetSignalList().FindString(-1, pSls);
if (nIndex != LB_ERR)
return nIndex;
return 0;
}
int SN_ListBox::FindString(int nStartIndex, LPCTSTR pszString)
{
MEMBERASSERT();
RPTRASSERT(pszString);
SN_REQUIRES_HWND(SN_ListBox::FindString);
if (m_hWnd)
return ListBox_FindString(m_hWnd, nStartIndex, pszString);
else
return 0;
}
void MDCDBG_assert(char *pszExp, char *pszFile, int nLine)
{
#ifdef _DEBUG
MDCDBG_Initialize();
#ifndef _WIN32_WCE
int nResponse = _CrtDbgReport(_CRT_ASSERT, pszFile, nLine, NULL, "%s", pszExp);
if (nResponse == 1)
_CrtDbgBreak();
#endif
#endif
}
在dbgrpt.c文件:
_CRTIMP int __cdecl _CrtDbgReportT(
int nRptType,
const TCHAR * szFile,
int nLine,
const TCHAR * szModule,
const TCHAR * szFormat,
...
)
{
int retval;
va_list arglist;
va_start(arglist,szFormat);
retval = _CrtDbgReportTV(nRptType, szFile, nLine, szModule, szFormat, arglist);//Fails here
va_end(arglist);
return retval;
}
觀察:在64位模式 * PSLS是沒有得到數據,但此變量在win32模式下獲取數據
有燒焦後的明星。 –
您是否在SendMessage或GetParents之一中發生崩潰?嘗試分別分配它們,看它是否真的到達SendMessage – cup
應用程序崩潰是因爲* pSls沒有獲取任何數據/字符串,而是我傳入的函數之一的字符串,但由於表達式未評估,所以它作爲一個糟糕的指針,因此崩潰。 –