我正在将32位应用程序移植到 64位,它是在 VC ++。net 2003 中构建的。我已在 32位和 64位平台中成功在 VS2010 sp1 中构建了此应用程序。但我在 64位平台(x64)应用程序中遇到应用程序崩溃问题,但在 32位平台(win32)中则没有。崩溃发生在下面的代码行
char *pSls = (char*)SendMessage( ::GetParent( ::GetParent( GetParen() ) ),
m_uMessageID,
L_SOM_CHANNEL, nChannel );
在 win32 * pSls 中获取数据,但在 64位中,Expression不会进行评估。 我观察到SendMessage的返回类型是LRESULT,它是一个LONG_PTR,LONG_PTR在 Win32中长,在64位平台中是_int64。 有人可以帮忙解决问题吗?
显示的实际错误: 表达式:!IsBadReadPtr((const void )(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;
}
观察: * pSls没有在x64模式下获取数据,但此变量以win32模式获取数据
答案 0 :(得分:1)
没有足够的信息来确定原因。如果我被允许推测,我之前已经看过这样的问题了。看起来SendMessage()的返回返回LPCTSTR?
我的预感......你有一些字符串...
LPCTSTR lpszRet = "abcdef"; // ignore error that this string might be on the stack
return (DWORD) lpszRet; // DWORD, or LONG, etc..., but error is here with pointer truncation
改为使用,
return (DWORD_PTR) lpszRet; // or LONG_PTR, etc ... pointer not truncated