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

标签 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

最佳答案

您的问题是,由于 ListView 存在于另一个进程中,因此您分配的内存在该其他进程中无效。我推荐给你 article over at The Code Project它提供了一个解决方案。

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

关于c++ - 如果目标应用程序在 C++ 中崩溃,则无法使用 LVM_GETITEMTEXT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4616281/

相关文章:

c++ - 如何使用 VARIANT 指定颜色

listview - 插入新记录后如何重新加载列表?

android - ListView 中的第一项显示不正确

android - 涟漪效应在 ListView 中不起作用

java - Apache qpid 队列 url

erlang - 使用它进行 JSON 数据传输

c++ - XCode 警告 "Instantiation of variable ' Singleton<Foo>::_instance' 这里需要,但没有可用的定义

c++ - 如何在编译期间输出诊断消息以告知调用了哪个重载函数

c++ - 如何在SFML 2.5.1中注册鼠标单击

akka - 即时通讯应用的 Actor 模型?