char szBuf[2048] = "";
int  nLVItemCount;
HANDLE hProcess;
LVITEM lvItemLocal;
DWORD dwBytesRead, dwBytesWrite;
BOOL  bSuccess,bWriteOK;
DWORD dwError;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if(NULL == hProcess)
{
printf("打开进程失败!\n");
}

LPVOID lpTextRemote = VirtualAllocEx(hProcess,NULL,2048,MEM_COMMIT,PAGE_READWRITE);
LPVOID lpListItemRemote = VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);

if((!lpTextRemote) || (!lpListItemRemote)) 
{
printf("不能在指定进程内分配存储空间!\n");
}
//查询虚拟内存的保护属性
MEMORY_BASIC_INFORMATION MemInfo;
DWORD  dwOldProtect;
MemInfo.RegionSize = sizeof(MEMORY_BASIC_INFORMATION);
VirtualQueryEx(hProcess,lpTextRemote,&MemInfo,sizeof(MemInfo));
if(MemInfo.State != MEM_COMMIT)
{
printf("分配状态失败!\n");
}
if(MemInfo.Protect & (PAGE_NOACCESS|PAGE_GUARD|PAGE_READONLY)) 
{
if(VirtualProtectEx(hProcess,(void*)lpTextRemote,4,PAGE_READWRITE,&dwOldProtect) == FALSE) 
{
printf("修改内存页属性失败!\n");
dwError = GetLastError();
printf("%d\n",dwError);
}
}
nLVItemCount=ListView_GetItemCount(hwnd);// 获取ListView行数 
for(int i=0;i < nLVItemCount;++i)
{
ZeroMemory(szBuf,2048);
bWriteOK = WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,2048,(LPDWORD)&dwBytesWrite);
dwError = GetLastError();
printf("%d\n",dwError);
if(!bWriteOK) 
{
printf("写内存错误\n");
}
for(int j=0;j<5;++j)
{
lvItemLocal.iItem = j; //获取第j列的数据
lvItemLocal.iSubItem = 0;
lvItemLocal.mask = LVIF_TEXT;
lvItemLocal.cchTextMax = 2047;
lvItemLocal.pszText = (LPTSTR)lpTextRemote;
dwBytesWrite = 0;
//将LVITEM结构写入进程
bWriteOK = WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
dwError = GetLastError();
printf("%d\n",dwError);
if(!bWriteOK) //写内存错误
{
printf("写内存错误\n");
}
SendMessage(hwnd,LVM_GETITEMTEXT,(WPARAM)j,(LPARAM)lpListItemRemote);
bSuccess = ReadProcessMemory(hProcess,lpTextRemote,szBuf,2048,&dwBytesRead);
dwError = GetLastError();
printf("%d\n",dwError);
//从指定进程存储空间读取文本
if(!bSuccess) //不能在指定进程内读取文本
{
printf("不能在指定进程内读取文本\n");
}
if(szBuf == NULL)
{
printf("获取内容失败!\n");
}
MyData = szBuf;
MessageBox(NULL,szBuf,NULL,MB_OK);
printf("%s\n",szBuf);
}

}
//在指定进程内释放存储空间
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
//关闭指定进程句柄
CloseHandle(hProcess);这段代码是读取其他进程中ListView控件的数据,程序运行没问题,就是得不到正确的结果,返回的错误值总是183
不知问题出在哪儿?
难道是:
1.被读取的进程采用了保护措施的?
2.代码本来有误?
3.逻辑不正确?
还望高手指点……

解决方案 »

  1.   

    首先用spy++看看你获取的控件句柄是否正确
    另外是你要看一下是不是标准控件,像qt那样的好像不行
    再就是你是什么系统,不是xp的话,看看权限问题。
      

  2.   

    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
    我在MSDN上看了这个函数,第二个参数应该为TRUE吧
      

  3.   

    感谢你的回答,这个我用SPY++查了的,获取是正确的,系统也是XP;
    我调用GetClassName返回的是SysListView32;这个应该是标准的控件吧!
      

  4.   

    感谢你的回答,这个参数只是表示该句柄是否可以被其他进程继承而已,这个功能我不需要,所以设置为FALSE;
      

  5.   

    有时程序正在运行,是read不到的
    权限问题
      

  6.   

    如果大家有好的读取其他进程ListView的数据的代码,希望能分享一下,万分感谢!
      

  7.   

    如果大家有好的读取其他进程ListView的数据的代码,希望能分享一下,万分感谢!
      

  8.   

    执行到哪里出错?代码看起来基本没问题,最可能的问题就是句柄不对。另外需要注意一点,如果函数调用成功,GetLastError不一定返回0。
      

  9.   

                lvItemLocal.cchTextMax = 2047;    
                lvItemLocal.pszText = (LPTSTR)lpTextRemote;这个有问题吧?把自己给覆盖了,可能会出错吧?
    为什么不试试:            lvItemLocal.cchTextMax = 2047 - size(LVITEM);    
                lvItemLocal.pszText = (LPTSTR)lpTextRemote+size(LVITEM);