如果目标应用程序在C ++中崩溃,则无法使用LVM_GETITEMTEXT

时间:2011-01-06 15:00:42

标签: c++ listview messaging

我正在尝试从另一个应用程序中捕获SysListView32类(根据Spy ++)的数据。向此句柄发送LVM_GETITEMCOUNT消息始终返回正确数量的项目。有一个子窗口,它是SysHeader32,可能包含标题标题。

当我尝试将LVM_GETITEMTEXT消息发送到目标应用程序时,它会崩溃。此消息的相关代码如下:

LPTSTR lpText;
LVITEM* lvItem;
lvItem = new LVITEM;
lvItem->iSubItem = 0;
lvItem->cchTextMax = 255;
lvItem->pszText = lpText;
//SysListViewHandle is the HWND to the SysListView32 'content' window
SendMessage(SysListViewHandle, LVM_GETITEMTEXT, 1, (long)lvItem);

列表中的每个“单元格”包含不超过50个字符的文本,因此最大文本大小应该没问题。

我希望从中获取数据的列表结构有16列和可变数量的条目,大于5,因此wParam应该没问题。此列表使用的样式是WS_CHILDWINDOW,WS_VISIBLE,WS_TABSTOP,WS_HSCROLL,LVS_REPORT,扩展样式为WS_EX_LEFT,WS_EX_LTRREADING,WS_EX_RIGHTSCROLLBAR,WS_EX_NOPARENTNOTIFY,WS_EX_CLIENTEDGE,LVS_GRIDLINES和LVS_FULLROWSELECT。

UISpy能够探测这个列表并查找其中的实际数据,所以我认为它是在公园散步以获取使用消息,但事实证明并非如此= /任何协助都会受到高度赞赏。

编辑:值得一提的是崩溃时的错误日志是: applicationname.exe中0x77582b87处的未处理异常:0xC0000005:访问冲突写入位置0x01bc48b0。 调用堆栈位置comctl32.dll 拆卸: 77582B87 mov dword ptr [esi],1

1 个答案:

答案 0 :(得分:3)

您的问题是,由于列表视图存在于另一个进程中,因此您分配的内存在该其他进程中无效。我建议您使用article over at The Code Project来提供解决方案。

更重要的是,您似乎没有为lpText分配任何内存,因此它会在您自己的进程中失败。