利用WM_COPYDATA消息实现进程间通信
进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现。
发送WM_COPYDATA消息:
SendMessage(hRecvWnd,
WM_COPYDATA,
(WPARAM)hSendWnd,
(LPARAM)&CopyData);
其中的CopyData为COPYDATASTRUCT结构类型,该结构定义如下:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
参数:
dwData; // Specifies data to be passed to the receiving application.
cbData; //Specifies the size, in bytes, of the data pointed to by the lpData member.
lpData; // Pointer to data to be passed to the receiving application. can be NULL.
注意:该消息只能由SendMessage()来发送,而不能使用PostMessage()。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之前,就被系统清除和回收。此外如果lpData指向一个带有指针或某一拥有虚函数的对象时,也要小心处理。
如果传入的句柄不是一个有效的窗口或当接收方进程意外终止时,SendMessage()会立即返回,因此发送方在这种情况下不会陷入一个无穷的等待状态中。
接收WM_COPYDATA消息:
只要用COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT*)lParam; 就可以了,接收方应认为这些数据是只读的。
由于发送方在接收方处理WM_COPYDATA消息完毕前都是处于等待中,所以接收方应当尽快处理WM_COPYDATA消息。
代码实现:
//发送端:
void CSendCopyDataDlg::OnBnClickedBtnSend()
{
CString strSendText;
m_EditSend.GetWindowText(strSendText);
if (strSendText.IsEmpty())
{
AfxMessageBox(_T("发送内容不能为空!"));
return;
} // 获取接收端窗口句柄
HWND hWnd = ::FindWindow(NULL,_T("RecvCopyData"));
if (hWnd == NULL)
{
AfxMessageBox(_T("数据接收端未启动!"));
return;
} // 发送数据
COPYDATASTRUCT CopyData;
CopyData.dwData = ;
CopyData.cbData = strSendText.GetLength() * ; //分配足够缓冲区长度,防止接收乱码
CopyData.lpData = (void*)strSendText.GetBuffer();
::SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);
strSendText.ReleaseBuffer();
} //接收端:
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct); ON_WM_COPYDATA()
BOOL CRecvCopyDataDlg::OnCopyData(CWnd* pWnd,
COPYDATASTRUCT* pCopyDataStruct)
{
//在编辑框中追加数据
SYSTEMTIME st;
CString strDateTime;
GetSystemTime(&st);
strDateTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d.%04d "),
st.wYear,
st.wMonth,
st.wDay,
st.wHour,
st.wMinute,
st.wSecond,
st.wMilliseconds);
CString strRecvText = strDateTime + (LPWSTR)(pCopyDataStruct->lpData);
m_RichEditRecv.SetSel(-, -);
m_RichEditRecv.ReplaceSel(strRecvText + _T("\n")); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
编译运行:

例子下载:http://pan.baidu.com/s/1i5n6Kex
利用WM_COPYDATA消息实现进程间通信的更多相关文章
- 用WM_COPYDATA消息来实现两个进程之间传递数据
文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法:在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有 1.使用内存映射 ...
- VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)
转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用: ...
- windows进程通信 -- WM_COPYDATA消息
WM_COPYDATA消息,在win32中用来进行进程间的数据传输. typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbD ...
- VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
消息作用: 在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT { ULONG_PTR dw ...
- 利用WM_COPYDATA进行进程间通信
发信消息 void CControlDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 CString strWindowTitle = _T ...
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
问题描述 : 用非管理员权限启动dzh,dzh再启动dtssm,由于dtssm的配置文件app.manifest 中设置了requireAdministrator,导致dtssm总是以管理员权 ...
- WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决
在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消 息无法传递.发送程序必须等于或者等于接收程序的权限.如发送与接收 是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样 ...
- 跨进程发送消息数据(发送WM_COPYDATA消息,够简单的)
1 //1.发送窗体 2 procedure TForm2.Button1Click(Sender: TObject); 3 var 4 h: HWND; 5 Size: Integer; 6 Cop ...
- 利用InsertStatusValueRequest消息为新增的statuscode设定指定值(Value)
我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
随机推荐
- 【Oracle】在win10上安装Oracle客户端报错:[INS-13001]环境不满足最低要求
环境:win10 64bit 客户端工具: 安装的时候报错: 解决方案: 在\client\stage\cvu目录下找到如下两个文件: 编辑这两个文件,在文件中分别添加如下内容 <OPERATI ...
- MyEclipse连接sqlserver2008具体流程
参照这里: 图形连接 http://wenku.baidu.com/view/f50838086c85ec3a87c2c53a.html 还有查看的是这个: 2. 重新用Window验证方式登陆 ...
- screen 命令使用及示例
screen 是一个非常有用的命令,提供从单个 SSH 会话中使用多个 shell 窗口(会话)的能力.当会话被分离或网络中断时,screen 会话中启动的进程仍将运行,你可以随时重新连接到 scre ...
- js处理url
需求:用js获得url的电话号码和状态 针对url地址:http://www.deikang.com/index.php?tel=15811296111&status=1&id=100 ...
- FFMPEG,将字幕“烧进”MP4视频中
原文地址:http://blog.csdn.net/ufocode/article/details/75475539 由于mp4容器,不像MKV等容器有自己的字幕流. MKV这种容器的视频格式中,会带 ...
- ocr 识别 github 源码
参考 [1] https://github.com/eragonruan/text-detection-ctpn [2] https://github.com/senlinuc/caffe_ocr [ ...
- javascript 打印错误信息 catch err
使用 console.log(err); 是无法打印出来的.默认只能打印出错误信息.如图 http.interceptors.response.use(response => { return ...
- unity, 欧拉角(euler angle)
1,按ZXY顺序. 2,左手螺旋. 3,Z,X,Y旋转均应以未旋转前的坐标系为准.
- Step by Step Learn Python(1)
print "Hello World!" action = raw_input("please select your action{1, 2, 3, 4, 5, 6, ...
- 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM 各公共网关接口介绍
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...