我正在尝试使用SendMessage函数显示列表框的内容。但是,当我按下按钮执行下面的代码时,我在调用时会在代码中得到以下段错误
SendMessage(hwndLBox,LB_GETTEXT,k,(LPARAM)lBoxitems);
Segfault(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编译我的代码。
答案 0 :(得分:1)
您需要为字符串分配空间。 char * lBoxitems = new char[getLboxitems];
分配一个char数组,该数组的大小与列表中的项目数相同。
我认为以下应该有效:
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;
}
但是,使用std::vector<std::vector<char>>
或std::vector<std::string>
会更容易:
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);
}
}
答案 1 :(得分:0)
我看到的两件事
您是否验证过getLboxitems是一个有效值(即两者都不是<= 0)还是荒谬地大?
在这种情况下,我认为你没有正确使用数组。您创建一个动态大小的数组,其大小为getLboxitems,这意味着如果列表框中有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()中使用的临时数组。