LVM_GETITEMTEXT 用于 C 中的 x32 和 x64

Lie*_*nau 5 c listview

我一直试图在 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)

Dav*_*nan 2

我认为你无法实现这一目标。在 32 位进程中,您的指针将太短。我相信,当从 32 位进程调用并使用 64 位进程句柄作为其第一个参数时,VirtualAllocEx 将会失败。我想如果您在代码中添加了错误检查,您就会看到这一点。

您唯一的解决方案是拥有 2 个版本:x86 和 x64。这应该不是什么真正的麻烦——通常可以通过单一来源来完成。