0

我正在尝试使用 SendMessage 函数显示列表框的内容。但是,当我按下按钮执行下面的代码时,当我调用时,我的代码中出现以下段错误

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 来编译我的代码。

4

2 回答 2

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>>orstd::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);
    }
}
于 2012-06-30T04:44:02.690 回答
0

我看到的两件事

  1. 您是否已验证 getLboxitems 是一个有效值(即既不 <= 0)还是大得离谱?

  2. 在这种情况下,我认为您没有正确使用数组。您创建一个大小为 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 数组而不是 2D 数组,并且只使用要在 SendMessage() 中使用的临时数组。

于 2012-06-30T04:24:26.907 回答