我想在windows mobile中阅读另一个进程listview控件的内容。为此,我需要一个指向该进程的一些空闲内存的指针,以便将值放在那里(然后从我的进程中读取它们)。这可以使用VirtualAllocEx function在普通Windows或Win32中完成。
但是,Windows Mobile不支持此功能!你能推荐我一种分配内存的方法吗?
答案 0 :(得分:2)
嗯,经过大量搜索,我相信我找到了一个有效的解决方案。我并不是说解决方案在100%的情况下都能完美运行或工作,但我相信这是Windows Mobile为我们提供的内存工具所能做到的最好。
以下是该方法的粗略描述(如果需要,我可以提供完整的源代码): a)使用CreateToolhelp32Snapshot从所有正在运行的进程中获取信息
CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS , 0 );
b)完成这些过程,直到找到带有listview的过程。你将有一个PROCESSENTRY32结构用于该进程,我们称之为pe32。
PROCESSENTRY32 pe32; if( !Process32First( hProcessSnap, &pe32 ) ) ... do { ... } while( Process32Next( hProcessSnap, &pe32 ) );
c)使用OpenProcess获取该进程的句柄,我们称之为hProcess。
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
d)从pe32.th32MemoryBase + 512开始,直到pe32.th32MemoryBase + 0x02000000(windows mobile 6中的进程有32 MB的内存空间),使用VirtualQuery方法接收有关该区域的信息。你将得到一个MEMORY_BASIC_INFORMATION结构,我们称之为mbi。内存区域将增加mbi.RegionSize
DWORD dwAddress = pe32.th32MemoryBase + 512; DWORD dwStopAddress = pe32.th32MemoryBase + 0x02000000; while (VirtualQuery((LPVOID)dwAddress, &mbi, sizeof(mbi))) { ... dwAddress += mbi.RegionSize; if (dwAddress >= dwStopAddress) break; }
e)检查mbi.State == MEM_COMMIT和mbi.Protect == PAGE_READWRITE。如果两者都为真,那么您可以写入该区域。另外,请查看mbi.RegionSize以查看内存区域是否足以满足您的数据需求。如果不满足条件,将到下一个区域。警告:你不知道你会写什么。您可以打破listview应用程序。稍后会详细介绍。
if(mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE ) { ... }
f)在前面的if(满足所有条件)内:声明一个指向mbi.BaseAddress的指针 - pe32.th32MemoryBase:
char * membase2 = (char *)mbi.BaseAddress - pe32.th32MemoryBase ;
g)现在您可以使用ReadProcessMemory和WriteProcessMemory读取或写入其他进程的内存!例如,这是我阅读listview内容的代码:
LVITEM lvi, *_lvi; LPWSTR _item; TCHAR item[128]; _lvi = (LVITEM *) membase2; _item = (LPWSTR)membase2; _item += 128; lvi.iSubItem=1; lvi.pszText=_item; lvi.iItem = 0; lvi.cchTextMax = 64; WriteProcessMemory(hProcess, _lvi, &lvi, sizeof(LVITEM), NULL); SendMessage(listHWND, LVM_GETITEMTEXT, (WPARAM)0, (LPARAM)_lvi); ReadProcessMemory(hProcess, _item, item, 128, NULL); wprintf(TEXT("%s\n"), item);
h)最后的想法:该方法确实有效。它已经过我的测试。但是,你必须始终考虑我之前提到的警告:你不知道你要写的地方:你将使用的记忆提交,你可以写信,但是你不确定你写的是什么。当然,这是其他应用程序的内存,所以你只能打破它。如果那不重要,你可以重新启动它并继续读取它的内存!当我测试它时,另一个应用程序甚至没有压碎一次,但它只关闭了一两次。此外,如果您无法使其工作,请尝试另一个内存区域(步骤d)。
答案 1 :(得分:0)
Windows CE 5设备不支持共享内存通信。
如果要在两个进程之间进行通信,可以选择一些选项。 也许最好(也是最简单)的选择是使用本地套接字,请参阅此主题: