2012-06-30 48 views
0

我想使用SendMessage函數顯示列表框的內容。然而,當我按下按鈕執行下面的一段代碼,我得到以下段錯誤在我的代碼,當我打電話Win32 C++:顯示列表框的內容

SendMessage(hwndLBox,LB_GETTEXT,k,(LPARAM)lBoxitems); 

段錯誤(dbgheap.c):

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
     const void * pUserData 
     ) 
{ 
     if (!pUserData) 
      return FALSE; 

     if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE)) 
      return FALSE; 

     return HeapValidate(_crtheap, 0, pHdr(pUserData)); 
} 

引起守則此段錯誤:

  else if(LOWORD(wParam)==ID_BUTTON_CALC){ 

       int getLboxitems = SendMessage(hwndLBox,LB_GETCOUNT,NULL,NULL); 

       char * lBoxitems = new char[getLboxitems]; 

       for(unsigned int k=0; k < getLboxitems; k++){ 
         SendMessage(hwndLBox,LB_GETTEXT,k,(LPARAM)lBoxitems); 
         MessageBox(hwnd,lBoxitems,"Listbox says",NULL); 
       } 

       delete[] lBoxitems; 
      } 

我正在使用Visual Studio Beta 2011編譯我的代碼。

回答

1

您需要爲您的字符串分配空間。 char * lBoxitems = new char[getLboxitems];分配一個字符數組,它是列表中有多少項目的大小。使用std::vector<std::vector<char>>std::vector<std::string>會更容易

else if(LOWORD(wParam)==ID_BUTTON_CALC) 
{ 
    int getLboxitems = SendMessage(hwndLBox, LB_GETCOUNT, NULL, NULL); 

    char ** lBoxitems = new char*[getLboxitems]; 

    for(unsigned int k = 0; k < getLboxitems; k++) 
    { 
     int textlength = SendMessage(control, LB_GETTEXTLEN, (WPARAM)k, NULL); 
     lBoxitems[k] = new char[textlength + 1]; // +1 for null terminator 
     SendMessage(hwndLBox, LB_GETTEXT, (WPARAM)k, (LPARAM)lBoxitems[k]); 
     MessageBox(hwnd, lBoxitems[k], "Listbox says" , NULL); 
    } 
    for (unsigned int k = 0; k < getLboxitems; k++) 
    { 
     delete [] lBoxitems[k]; 
    } 
    delete[] lBoxitems; 
} 

然而,: 以下應工作,我覺得

else if(LOWORD(wParam)==ID_BUTTON_CALC) 
{ 
    int getLboxitems = SendMessage(hwndLBox, LB_GETCOUNT, NULL, NULL); 

    std::vector<std::string> v(getLboxitems); 

    for(unsigned int k = 0; k < getLboxitems; k++) 
    { 
     int textlength = SendMessage(control, LB_GETTEXTLEN, (WPARAM)k, NULL); 
     v[k].resize(textlength + 1); 
     std::string& buff = v[k]; 
     SendMessage(hwndLBox, LB_GETTEXT, (WPARAM)k, (LPARAM)&buff[0]); 
     MessageBox(hwnd, v[k].c_str(), "Listbox says" , NULL); 
    } 
} 
+0

這就是我一直在尋找的!我輸入這個代碼將進入我的算法,需要字符串。謝謝! –

0

兩件事情我看到

  1. 你有驗證getLboxitems是一個有效的值(即既不< = 0),或荒謬之大?我不認爲你在這種情況下正確使用數組。你創建一個動態大小的數組,大小爲getLboxitems,這意味着如果你的列表框中有5個項目,你將有效地創建一個由5個char組成的數組(而不是你所假定的char *或char [])。您將需要創建數組是這樣的:

    // verify with MSDN that 255 is large enough 
    char* lBoxitems[255] = new char[getLboxitems][255]; 
    for(unsigned int k=0; k < getLboxitems; k++) { 
        SendMessage(hwndLBox, LB_GETTEXT, k, (LPARAM)(lBoxitems[k])); 
        MessageBox(hwnd, lBoxitems[k], "Listbox says", NULL); 
    } 
    

當心,未經測試的代碼。

編輯:謝謝Jesse Good糾正。

另外我想指出的是,這種方法不是很C++ - y。您可能想要使用std::vector<std::string>而不是2D數組,並且只使用SendMessage()中使用的臨時數組。

+0

奇怪,我從來沒有見過的格式化行爲像那樣。也許這是編號列表或其他東西。我把一個不太優雅的解決方案。 – chris

+0

謝謝!我甚至嘗試將代碼複製粘貼到記事本中,然後再次將其放回到這裏,以使其丟失任何可以在背景中拾取的格式(如在MS Office中),但它不起作用: – ApplePie

+0

啊,這確實是名單。你需要4個額外的空間。 – chris