进程间通讯SendMessage

PostMessage貌似只能用于进程内通讯,不同进程间通讯可以用SendMessage和共享内存等方式。这里理出SendMessage的用法,方便日后查阅。

发送消息的进程代码:

const UINT messageID = RegisterWindowMessage("SingletonApplication");

char szTemp[1024] = { 0 };
sprintf(szTemp, "LayeredWindow_%d", iWndID);//窗口名
HWND hTemp = ::FindWindow(NULL, szTemp);//窗口句柄
BYTE* pGlobal = (BYTE*)::GlobalAlloc(GMEM_FIXED, str.length());//全局内存
if (!pGlobal)
{
	return;
}
else
{
	ZeroMemory(pGlobal, str.length());
	memcpy(pGlobal, str.c_str(), str.length());
}
COPYDATASTRUCT copyData = {0};
copyData.dwData = messageID;
copyData.cbData = (DWORD)(str.length()+1);
copyData.lpData = pGlobal;
SendMessage(hTemp, WM_COPYDATA, 0, (LPARAM)&copyData);
::GlobalFree((HGLOBAL)pGlobal);//释放全局内存

这里注意要分配全局内存,否则另一进程接受消息时,消息被释放,接受的是乱码,无法解析。

接受消息的进程(这里是win32窗口。如果是MFC窗口进程,可采用消息映射,在响应函数内解析接受的消息,示例代码网上例子较多,这里不再赘述)代码:

在WndProc消息响应函数添加消息响应:

const UINT messageID = RegisterWindowMessage(L"SingletonApplication");
.
.
.
case WM_COPYDATA:
	{
		//两进程间通讯
		COPYDATASTRUCT* copy_data_structure = { 0 };
		copy_data_structure = (COPYDATASTRUCT *)lParam;
		if (copy_data_structure->dwData == messageID)
		{
			string str = (char*)copy_data_structure->lpData;//接受的消息
		}
	}
	break;
.
.
.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值