在窗口7中移植32位到64位MFC应用程序

时间:2015-10-20 09:09:37

标签: visual-c++ mfc 32bit-64bit

我正在将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模式获取数据

1 个答案:

答案 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