您的位置:首页 > 其它

windows进程间通讯的方法

2009-04-13 15:47 423 查看

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。



1.使用共享内存

代码如下:

void FileMapping(void)
{
	//打开共享的文件对象。
	m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,	FALSE,_T("TestFileMap"));
	if (m_hMapFile)
	{
		//显示共享的文件数据。
		LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
		OutputDebugString(lpMapAddr);
	}
	else
	{
		//创建共享文件。
		m_hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "TestFileMap");
		//拷贝数据到共享文件里。
		LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
		
		StrCpy(lpMapAddr,"TestFileMap");
		FlushViewOfFile(lpMapAddr,12+1);
	}
}


注意:使用完成共享内存后,要删除共享内存,否则会生成很多临时文件。

UnmapViewOfFile(m_hMapFile)

2.使用dll在进程间共享内存

#pragma data_seg (".IdleUI") // you must define as SHARED in .def
HHOOK g_hHookKbd = NULL; // one instance for all processes
HHOOK g_hHookMouse = NULL; // one instance for all processes
DWORD g_dwLastInputTick = 0; // tick time of last input event
#pragma data_seg ()
然后在def文件中定义:SECTIONS .IdleUI READ WRITE SHARED

注意:共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3.使用WM_COPYDATA在窗体程序间传递消息。



发送的时候的代码如下:WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:

HWND hWnd=::FindWindow(NULL,"b");
	if(hWnd!=NULL)   
	{   
		COPYDATASTRUCT   cpd;   /*给COPYDATASTRUCT结构赋值*/   
		cpd.dwData   =   0;   		
		cpd.cbData   =   strlen("字符串");   		
		cpd.lpData   =   (void*)"字符串";   		
		::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!   		
	}


接收的时候:

afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);



BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}



4.调用ReadProcessMemory以及WriteProcessMemory函数.

调用ReadProcessMemory以及WriteProcessMemory函数用户在发送进程中分配一块内存存放数据,调用GlobalAlloc或VirtualAlloc函数实现:
pApp->m_hGlobalHandle=GlobalAlloc(GMEM_SHARE,1024);
可以得到指针地址:
pApp->mpszGlobalHandlePtr=(LPSTR)GlobalLock
(pApp->m_hGlobalHandle);
在接收进程中要用到用户希望影响的进程的打开句柄。为了读写另一进程,按如下方式调用OpenProcess函数:
HANDLE hTargetProcess=OpenProcess(
STANDARD_RIGHTS_REQUIRED|
PROCESS_VM_REDA|
PROCESS_VM_WRITE|
PROCESS_VM_OPERATION,//访问权限
FALSE,//继承关系
dwProcessID);//进程ID
为保证OpenProcess函数调用成功,用户所影响的进程必须由上述标志创建。
用户获得一个进程的有效句柄,就可调用ReadProcessMemory函数读取该进程的内存:
BOOL ReadProcessMemory(
HANDLE hProcess, // 进程指针
LPCVOID lpBaseAddress, // 数据块的首地址
LPVOID lpBuffer, // 读取数据所需缓冲区
DWORD cbRead, // 要读取的字节数
LPDWORD lpNumberOfBytesRead
);
使用同样的句柄也可以写入该进程的内存:
BOOL WriteProcessMemory(
HANDLE hProcess, // 进程指针
LPVOID lpBaseAddress, // 要写入的首地址
LPVOID lpBuffer, // 缓冲区地址
DWORD cbWrite, // 要写的字节数
LPDWORD lpNumberOfBytesWritten
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: