您的位置:首页 > 其它

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,其实一样。)。

还有,如果你要声明一个线程之间的通讯标志变量,例如 bool bStop 那么最好把它加上 volatile 关键字,这样会防止编译器在优化时把改变量的值存储在寄存器内,引起变量值的过期。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: