【问题标题】:First-chance exception settings check state in ListviewListview 中的第一次机会异常设置检查状态
【发布时间】:2012-08-20 11:04:09
【问题描述】:

我在 Visual Studio 的输出窗口中收到以下错误:

First-chance exception at 0x5d0d47af (msvcr100d.dll) in Program.exe: 0xC0000005: Access violation reading location 0xcccccccc.

每次执行这段代码时:

const int iItem = ListView_GetItemCount(hListOutput);

LVITEM lvI;

lvI.mask        = LVIF_TEXT | LVIF_GROUPID;
lvI.iSubItem    = 0;
lvI.iGroupId    = 101;
lvI.iItem       = iItem;
lvI.pszText     = const_cast<LPWSTR>(mystr.c_str());

if (ListView_InsertItem(hListOutput, &lvI) != -1)
{
    ListView_SetCheckState(hListOutput, iItem, TRUE);
}

如果我将 ListView_SetCheckState 注释掉,我将停止访问冲突。

正在插入所有项目并正在设置项目检查状态。
但我想弄清楚为什么我会遇到访问冲突。

【问题讨论】:

  • 您是否记得调用ListView_SetExtendedListViewStyle 来设置LVS_EX_CHECKBOXES 扩展样式? ListView_SetCheckState 被记录为仅适用于 LVS_EX_CHECKBOXES 列表视图。

标签: c++ windows winapi access-violation


【解决方案1】:

ListView_SetCheckState(hListOutput, iItem, TRUE);

这似乎是错误的,因为它指向的值比列表中可用的值大一(因为索引为零)。

试试

unsigned int iItem1=iItem-3;//anything greater than zero..

ListView_SetCheckState(hListOutput,iItem1, TRUE);

【讨论】:

  • 我在设置检查状态之前插入项目,所以这不应该是问题。查看更新的代码。
  • 先检查是否插入成功,但是如果我提供的代码工作,那么一定是插入失败。否则告诉我。
  • 插入成功。我正在插入 4 个项目,并且所有 4 个都已插入。我还检查了返回值以确保没有问题。
  • 尝试将 iItem 设置为 UINT - 没有区别。
  • ListView_SetCheckState 的代码在哪里定义。注意此函数对 .dll 文件的调用,该文件又会在检索值时引发错误。
【解决方案2】:

ListView_InsertItem的返回值是否等于iItem? MSDN 文档指出项目索引是从插入函数返回的,因此在设置检查状态时使用该值可能是最安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多