2012-06-30 52 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