WM_COPYDATA传回返回值的一个方案

方案背景

适应场景,通过WM_COPYDATA进行进程间通信时,SendMessage不能返回自定义的数据,由此想到以下思路解决这个问题

  • A进程使用VirtualAlloc分配一块内存,通过某种方式将此地址以及A进程ID传给另一个进程B

  • B进程使用OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,FALSE, nRemoteProcessId)打开A进程的句柄,然后使用WriteProcessMemory向A进程指定地址写入数据

  • A进程即可从内存中读取值。

代码举例

进程A

{
	//分配一块8KB大小的区域给另外一个进程写入返回值
	const int nMaxBuffSize = 8192;
	LPVOID lpResultMem = ::VirtualAlloc(NULL, nMaxBuffSize, MEM_COMMIT, PAGE_READWRITE);


	Binary binData;
	binData.WriteUInt32(GetCurrentProcessId());//此进程ID
	binData.WriteUInt64(UINT64(lpResultMem));//此进程分配的一块共享内存块
	//通过SendMessage发送WM_COPYDATA消息给另外一个进程
	//代码略
	//...
	//LRESULT nResult = ::SendMessage(...);

	if (nResult)
	{
		//读取lpResultMem中的值
		int* pValue = (int*)lpResultMem;
		//pValue的值应该为另一个进程写入的8888

		//代码略
		//...
	}

	//释放
	::VirtualFree(lpResultMem, 0, MEM_RELEASE);
	lpResultMem = 0;
}

进程B

BOOL ProcessB::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	//其他代码
	//略
	//....

	DWORD nRemoteProcessId = pBinData->ReadUInt32();//远程进程ID
	UINT64 nRemoteAddress = pBinData->ReadUInt64(); //远程可写入地址 最多8kb
	
	//打开远程进程
	HANDLE hRemoteProcess = ::OpenProcess(
		PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,
		FALSE, nRemoteProcessId);

	//写入一个整数或其他的内容,但要小于对方进程分配的大小,此处为8kb
	int nValue = 8888;
	SIZE_T nWriteSize = 0;
	::WriteProcessMemory(hRemoteProcess, LPVOID(nRemoteAddress),
		&nValue, sizeof(int), &nWriteSize);
	::CloseHandle(hRemoteProcess);
	hRemoteProcess = NULL;
	if (nWriteSize == 0)
	{
		return FALSE;
	}
	return TRUE;

	//其他代码
	//略
	//....
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值