我一直试图在 listview 另一个进程中获取项目的文本。我在CodeProject上找到了一个很棒的教程。感谢这篇文章,我能够在 x32 上做到这一点。但是当尝试在 x64 上运行时,它会在调用 SendMessage 时使我尝试访问的应用程序崩溃。在文章评论中,由于指针大小不同,人们遇到了类似的问题。有些人建议使用我无法使用的 x64 编译器。我需要我的程序在 x32/x64 上运行。一位男士建议:
我有答案。LVITEM 结构在 64 位系统下是错误的。指针现在是 64 位的,所以文本指针后面必须跟一个虚拟值,以正确偏移长度成员。
我认为这将是最好的解决方案,因为我可以使用一个 exe 为 x32 和 x64 运行它。我只是不知道该怎么做他在说什么。我已经包含了我目前适用于 x32 的代码。如果有人可以帮助我。那太棒了。
LVITEMLVITEM lvi, *_lvi;
char item[512];
char *_item;
unsigned long pid;
HANDLE process;
GetWindowThreadProcessId(procList, &pid);
process = OpenProcess(0x001f0fff, FALSE, pid);
_lvi = (LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), 0x1000, 4);
_item = (char*)VirtualAllocEx(process, NULL, 512, 0x1000, 4);
lvi.cchTextMax = 512;
int r, c;
for (r = 0; r < rowCount; r++)
{
for (c = 0; c < columnCount; c++)
{
lvi.iSubItem = c;
lvi.pszText =_item;
// Insert lvi into programs's memory
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
// Have program write text to in its memory where we told it to
SendMessage(procList, LVM_GETITEMTEXT, (WPARAM)r, (LPARAM)_lvi);
// Get TVITEM back from programs
ReadProcessMemory(process, _item, item, 512, NULL);
}
}
// Clean up the mess we made
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
CloseHandle(process);
Run Code Online (Sandbox Code Playgroud)
我认为你无法实现这一目标。在 32 位进程中,您的指针将太短。我相信,当从 32 位进程调用并使用 64 位进程句柄作为其第一个参数时,VirtualAllocEx 将会失败。我想如果您在代码中添加了错误检查,您就会看到这一点。
您唯一的解决方案是拥有 2 个版本:x86 和 x64。这应该不是什么真正的麻烦——通常可以通过单一来源来完成。
| 归档时间: |
|
| 查看次数: |
3280 次 |
| 最近记录: |