2015-10-20 156 views
-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模式下獲取數據

+0

有燒焦後的明星。 –

+0

您是否在SendMessage或GetParents之一中發生崩潰?嘗試分別分配它們,看它是否真的到達SendMessage – cup

+0

應用程序崩潰是因爲* pSls沒有獲取任何數據/字符串,而是我傳入的函數之一的字符串,但由於表達式未評估,所以它作爲一個糟糕的指針,因此崩潰。 –

回答

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