使用指针进行进程间通信,大致思想就是,在一个应用程序中获得某个变量的地址,然后在另一个应用程序中通过内存读写来改变这个地址中的值,或者提取这个地址中的值。这就是整个过程,很简单。两个应用程序沟通的桥梁就是某个变量的地址(指针)。
找到进程句柄: 首先在一个应用程序中,找到进程窗口的句柄(FindWindow()), 然后获得进程ID(GetWindowThreadProcessId(hWnd, &pid )),执行后pid就代表进程ID,通过pid找到进程句柄(OpenProcess (PROCESS_ALL_ACCESS,FALSE,pid)),
基地址: LPVOID lpBaseAddress=(LPVOID)0x12fee8;
读值:ReadProcessMemory(hProcess ,
lpBaseAddress,(void*)&dwValue,sizeof(DWORD),0);
写值:WriteProcessMemory(hProcess ,
lpBaseAddress,(void*)&dwValue,sizeof(DWORD),0)) ;
主要代码如下:
读值:
DWORD pid;
HWND hWnd = ::FindWindow (NULL,TEXT("TestServer"));//找到进程的窗口句柄
if(!hWnd)
{
AfxMessageBox("没有找到TestServer进程.");
return;
}
::GetWindowThreadProcessId(hWnd, &pid );
HANDLE hProcess = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,pid);
LPVOID lpBaseAddress=(LPVOID)0x12fee8;
DWORD dwValue;
if(!::ReadProcessMemory(hProcess ,
lpBaseAddress,(void*)&dwValue,sizeof(DWORD),0)) return;
m_strRead.Format("%d",dwValue);
UpdateData(FALSE);
写值:
DWORD pid;
HWND hWnd = ::FindWindow (NULL,TEXT("TestServer"));
if(!hWnd)
{
AfxMessageBox("没有找到TestServer进程.");
return;
}
::GetWindowThreadProcessId(hWnd, &pid );
HANDLE hProcess = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,pid);
LPVOID lpBaseAddress=(LPVOID)0x12fee8;
UpdateData();
DWORD dwValue=atoi(m_strWrite);
if(!::WriteProcessMemory(hProcess ,
lpBaseAddress,(void*)&dwValue,sizeof(DWORD),0)) return;