SendMessage进程间简单通信问题
2008-10-15 11:14
295 查看
本例以两个VC Dialog application 为例用SendMessage进行两进程间简单通信:
主要API:FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName )
//通过进程名得到进程handle
SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
//The result of the message processing; its value depends on the message sent.
主程序 Server :其他均为默认.
MFC 建立一Dialog 应用程序,工程名字:Server
添加一Button控件command,并与之对应的函数OnCommand
在ServerDlg.h里添加自己的消息:#define WM_COMM WM_USER+10
函数 OnCommand 添加代码:
{
CString str="Client";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);//通过SendMessage的后两个参数
//WPARAM wParam, LPARAM lParam传递信息
else MessageBox("FindWindow NULL");
}
MFC另 建立一Dialog 应用程序,工程名字:Client 在 其
OnInitDialog里最后添加代码SetWindowText("Client");
在Client.h里添加自己的消息:#define WM_COMM WM_USER+10
添加消息映射:
BEGIN_MESSAGE_MAP(CSenderDlg, CDialog)
//{{AFX_MSG_MAP(CSenderDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COMM,OnSendMsg)//添加的自己的消息处理
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
给ClientDlg.cpp添加自己的消息处理函数OnSendMsg(WPARAM wParam, LPARAM lParam)
{
// wParam lParam既是要传递的信息
if(wParam==0 && lParam==0)
AfxMessageBox("HelloWorld!");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
给线程传递参数的方法
typedef struct tagMyParam{
HWND hHost;
.../*other struct member*/
}MyParam;
DWORD WINAPI MyThreadProc(LPVOID param)
{
MyParam* pmp = (MyParam*)param;
.../*you codeing*/
SendMessage(pmp->hHost,....);
...
}
/*主线程内把要使用的窗口句柄赋给结构*/
MyParam mp;
mp.hHost = m_hWnd; /*you master window handle*/
...
/*创建线程是把参数传进去*/
DWORD dwid;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,(void*)&mp,0,&dwid);
不同线程之间的数据存储最好存在 Heap 里,或者全局变量也行,也就是说千万不要把楼上的 MyParam mp; 变量声明在函数过程中,这样函数一结束 &mp 该指针指向的数据就会失效。因此你一定要把它放到全局变量或动态分配的内存中(malloc 或 HeapAlloc,其实一样。)。
主要API:FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName )
//通过进程名得到进程handle
SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
//The result of the message processing; its value depends on the message sent.
主程序 Server :其他均为默认.
MFC 建立一Dialog 应用程序,工程名字:Server
添加一Button控件command,并与之对应的函数OnCommand
在ServerDlg.h里添加自己的消息:#define WM_COMM WM_USER+10
函数 OnCommand 添加代码:
{
CString str="Client";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);//通过SendMessage的后两个参数
//WPARAM wParam, LPARAM lParam传递信息
else MessageBox("FindWindow NULL");
}
MFC另 建立一Dialog 应用程序,工程名字:Client 在 其
OnInitDialog里最后添加代码SetWindowText("Client");
在Client.h里添加自己的消息:#define WM_COMM WM_USER+10
添加消息映射:
BEGIN_MESSAGE_MAP(CSenderDlg, CDialog)
//{{AFX_MSG_MAP(CSenderDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COMM,OnSendMsg)//添加的自己的消息处理
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
给ClientDlg.cpp添加自己的消息处理函数OnSendMsg(WPARAM wParam, LPARAM lParam)
{
// wParam lParam既是要传递的信息
if(wParam==0 && lParam==0)
AfxMessageBox("HelloWorld!");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
给线程传递参数的方法
typedef struct tagMyParam{
HWND hHost;
.../*other struct member*/
}MyParam;
DWORD WINAPI MyThreadProc(LPVOID param)
{
MyParam* pmp = (MyParam*)param;
.../*you codeing*/
SendMessage(pmp->hHost,....);
...
}
/*主线程内把要使用的窗口句柄赋给结构*/
MyParam mp;
mp.hHost = m_hWnd; /*you master window handle*/
...
/*创建线程是把参数传进去*/
DWORD dwid;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,(void*)&mp,0,&dwid);
不同线程之间的数据存储最好存在 Heap 里,或者全局变量也行,也就是说千万不要把楼上的 MyParam mp; 变量声明在函数过程中,这样函数一结束 &mp 该指针指向的数据就会失效。因此你一定要把它放到全局变量或动态分配的内存中(malloc 或 HeapAlloc,其实一样。)。
还有,如果你要声明一个线程之间的通讯标志变量,例如 bool bStop 那么最好把它加上 volatile 关键字,这样会防止编译器在优化时把改变量的值存储在寄存器内,引起变量值的过期。
相关文章推荐
- SendMessage进程间简单通信问题
- SendMessage进程间简单通信问题
- 简单的实现,在无名管道里父子进程间的通信(大小写的转换)
- 简单的实现在有名管道里,进程间的通信(非阻塞)。
- 简单的通信问题
- 监听socket被子进程继承导致的通信问题
- linux下进程间共享内存通信的问题
- 关于进程或机器间通信问题
- 简单的android进程间(远程)服务通信示例【AIDL方式】
- 计算机操作系统 2.5对经典进程的同步问题 的简单解释
- android 进程与线程 进程与进程 线程与线程通信问题
- 【原创】TCP Socket 简单练习 --- 新进程辅助通信 分类: Linux --- 应用程序设计 2014-12-23 10:27 64人阅读 评论(0) 收藏
- 设置 NULL DACL 权限描述符解决ASP.NET 通过 FileMapping 与其他进程通信问题
- 无线通信中功率/速率调度的优化问题:一种最简单的情形
- C#中使用SendMessage进行进程通信的实例
- C++技术问题总结-第2篇 进程通信
- Linux进程通信简单总结(一)
- 进程间的通信简单总结
- 进程通信-SendMessage使用方法
- C/C++:linux进程通信简单例子(管道)