2013-03-19 10 views
0

所以我有堆問題的腐敗,並想知道如果它可能與我如何處理一些數組。事實上,在某些時候我有一個像這樣送到我Winproc傳了幾個信息:將一個WCHAR數組作爲LPARAM發送給winproc的正確方法是什麼?

SendMessage(hwnd, LOG_ADD, NULL, (LPARAM)L"Initializing winsock... "); 

LOG_ADD被定義爲104內部Winproc傳,當味精== LOG_ADD,會發生以下情況:

case LOG_ADD: 
      { 
       pGame->pMessageLog->PutToLog((WCHAR*)lParam); 
       pGame->pD2DResources->OnRender(pGame->pMessageLog); 

有MessageLog :: PutToLog(WCHAR []):

void MessageLog::PutToLog(WCHAR txt[]) 
{ 
    int strLen=wcslen(txt); 
    int logLen=wcslen(logHistory); 

    WCHAR* pWCHAR = txt; 

    int x=0; 

    // Counts the number of '\n' into wString and adds that number to nLogLines 
    for(x=0; x<strLen; x++) 
    { 
     if(pWCHAR[x]=='\n') 
      nLogLines++; 
    } 

    pWCHAR = logHistory; 

    x=0; 
    while(nLogLines>5) 
    { 
     if(pWCHAR[x]=='\n') 
      nLogLines--; 
     x++; 
    } 

    if(x!=0) 
    { 
     for(int y=0; y<logLen-x; y++) 
     { 
      pWCHAR[y]=pWCHAR[y+x]; 
     } 
    } 

    wcscat (logHistory, txt); 
} 

這可以解釋腐敗問題嗎?實際上,當我刪除所有SendMessage(hwnd,LOG_ADD ...)行時,編譯器執行「struct hostent * host;」行後,損壞不會在幾行後出現。或「if((host = gethostbyname(server))== NULL)」。

+0

你怎麼知道你有堆損壞? – 2013-03-19 00:49:20

+0

我的程序中斷了,我收到了這條消息。但是,我只是意識到我沒有初始化nLogLines和logHistory。現在我初始化它們,堆問題的腐敗消失了,儘管我還有其他問題。 不過,這是發送一個WCHAR數組作爲LPARAM並將其發送給另一個函數使用的正確方法嗎? – 2013-03-19 00:52:41

+1

@MickaelBergeronNéron - 是的,你正在做的很好。這正是'WM_SETTEXT'所做的。 – shf301 2013-03-19 00:58:59

回答

2

你問評論:

這是發送WCHAR數組作爲LPARAM並將其發送給另一個函數使用的正確方法?

當然,只要你知道你通過什麼在調用網站,並確保你把它(丟),因爲它實際上是在窗口過程中的類型,這是完全正常的。

只要確保您正確處理任何指向內存的指針,這些指針在訪問時可能無效。例如,如果你消息而不是發送它並傳遞一個指針,內存超出了範圍內的接收方處理消息之前。

還記得正確初始化你發送任何數據...

相關問題