加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

x32的LVM_GETITEMTEXT和C的x64

发布时间:2020-12-13 23:00:43 所属栏目:Linux 来源:网络整理
导读:我一直试图让listview中的项目文本成为另一个过程.我在 CodeProject找到了一个很棒的教程.感谢这篇文章,我能够在x32上做到这一点.但是当尝试在x64上运行时,它会在调用SendMessage时崩溃我正在尝试访问的应用程序.在文章评论中,由于指针大小不同,人们有类似的
我一直试图让listview中的项目文本成为另一个过程.我在 CodeProject找到了一个很棒的教程.感谢这篇文章,我能够在x32上做到这一点.但是当尝试在x64上运行时,它会在调用SendMessage时崩溃我正在尝试访问的应用程序.在文章评论中,由于指针大小不同,人们有类似的问题.有人建议使用我不能使用的x64编译器.我需要我的程序在x32 / x64上运行.一个人建议:

I have the answer. The LVITEM
structure is wrong under 64-bit
systems. Pointers are 64-bit now,so
the text pointer has to be followed by
a dummy value,to offset the length
member correctly.

我认为这将是最好的解决方案,因为我可以用一个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,512,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,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,NULL);
     }
 }
 // Clean up the mess we made
 VirtualFreeEx(process,MEM_RELEASE);
 VirtualFreeEx(process,MEM_RELEASE);
 CloseHandle(process);

解决方法

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

您唯一的解决方案是拥有2个版本,x86和x64.这应该不是真正的麻烦 – 通常可以用单一来源完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读