使用内存读写函数实现进程间通信
自定义消息和内存读写函数(ReadProcessMemory()和WriteProcessMemory())相结合,利用他们各自的长处进行通信。
自定义消息通信只能传递一个长整型数值,而内存读写函数却需要一个内存读写地址,并且缺少一个传递数据指针的方法。
这样他们正好可以“合作”来进行大批量的数据传递工作。
发送端的工作:
1、自定消息
#define wm_nMenMsg WM_USER+10
2、实现发送端的代码:
{
UpdateData();
CWnd *pwnd = CWnd::FindWindow(NULL,_T("RecvData"));
if (pwnd == NULL)
{
return ;
}
//获取进程的ID
DWORD PID;
GetWindowThreadProcessId(pwnd->m_hWnd,(DWORD*)&PID);
HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
//分配虚拟内存
int len = (m_SendData.GetLength()+1)*sizeof(TCHAR);
LPVOID lpBaseAddress;
lpBaseAddress = VirtualAllocEx(hprocess,0,len,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if (lpBaseAddress == NULL)
return ;
WriteProcessMemory(hprocess,lpBaseAddress,m_SendData,len,NULL);
pwnd->SendMessage(wm_nMenMsg,NULL,(LPARAM)lpBaseAddress);
}
接收端的工作
1、自定义消息
#define wm_nMenMsg WM_USER+10
2、添加消息映射函数
BEGIN_MESSAGE_MAP(CRecvDataDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(wm_nMenMsg,OnRegMenMsg)//添加的消息映射函数
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、实现接收的关键代码
LRESULT CRecvDataDlg::OnRegMenMsg(WPARAM wparam,LPARAM lparam)
{
LPVOID lpBaseAddress = (LPVOID)lparam;
HANDLE hProcess = GetCurrentProcess();
TCHAR data [MAX_SIAZE];
ReadProcessMemory(hProcess,lpBaseAddress,data,MAX_SIAZE,NULL);
m_RecvData = (CString)data;
UpdateData(FALSE);
return TRUE;
}