请教:我自己做的2个exe程序,我怎么让它们关联起来 请教:我自己做的2个exe程序,我怎么让它们关联起来 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,使用windows 消息啊,SendMessage 我用ShellExecute运行程序了,但是只得到hinstance,我想postmessage,没有hwnd怎么办 我用ShellExecute运行程序了,但是只得到hinstance,我想postmessage,没有hwnd怎么办 应该可以用EnumWindows和EnumWindowsProc吧 2个进程之间通信方法:1.可以采用sendmessage发送WM_COPYDATA消息2.可以采用socket通信的方式3.DDX方式4.剪贴板的数据共享(第三种我没用过) 用CreateProcess来启动另一个exe,这个会返回LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION 两个参数,具体再看下MSDN,这些参数已经可以满足你发消息的需要了 FindWindow 可以找到一个进程的窗口句柄,可以发消息的!但是,进程间通信,用POSTMESSAGE好像挺困难的!如果要用POSTMESSAGE,好像要特别处理,我没有用过;一般用sendmessage,消息自己定义的用起来也非常麻烦,最好用COPYDATA消息! if(FindWindow来找不到要运行的程序){ 用ShellExecute来运行程序}用内存共享方法通信:数据的生产者其中data是要通信的数据结构,比如int data[10];int *m_hMapView;HANDLE m_hMapObject;int data[10];#define WM_MYMESSAGE WM_USER + 100//在数据的消费者创建之前,创建文件视图BOOL CMyDlg::OnMemFilec(){ m_hMapObject=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(data),_T("DataMap")); if(m_hMapObject==NULL) { AfxMessageBox("无法创建文件映射对象"); return false; } m_hMapView=(int*)::MapViewOfFile(m_hMapObject,FILE_MAP_WRITE,0,0,0); if(m_hMapView==NULL) { AfxMessageBox("无法创建文件视图"); return false; } return true;}void CMyDlg::OnTimer(UINT nIDEvent){ //用一个定时器给data的成员赋值,并拷贝到文件视图里面 memcpy((void*)m_hMapView,(void*)&data,sizeof(data)); CWnd *pWnd=CWnd::FindWindow(NULL,"进程同步(消费者)"); //用目标进程的窗口的captain来获得窗口句柄 if(pWnd) //如果窗口找到了,发送一个自定义全局消息 { pWnd->SendMessage(WM_MYMESSAGE , NULL, NULL); }}数据的消费者,从共享内存里面取值#define WM_MYMESSAGE WM_USER + 100bool mapopenflag;LPVOID m_hMapView;HANDLE m_hMapObject;int data[10];//在窗口初始化的时候获取文件视图void CMyDlg::OnMapOpen(){ if (mapopenflag==false) { m_hMapObject=::OpenFileMapping(FILE_MAP_READ,FALSE,_T("DataMap")); if(m_hMapObject==NULL) { AfxMessageBox("无法打开文件映射对象"); return; } m_hMapView=::MapViewOfFile(m_hMapObject,FILE_MAP_READ,0,0,0); if(m_hMapView==NULL) { AfxMessageBox("无法获取文件视图"); return; } mapopenflag=true; }}LRESULT CMyDlg::OnMyMessage(WPARAM wp, LPARAM lp)//对全局的消息的处理函数{ if(maphaveopen) memcpy((void*)&data,(void*)m_hMapView,sizeof(data)); //从共享的内存里面读数据}具体查一下MSDN BOOL PostMessage( HWND_BROADCAST, // 系统广播 UINT Msg, // 注册自己的message,不然,除child窗口外,其他的所有窗口都会处理这个消息。 WPARAM wParam, // first message parameter 如果要传递指针,需要使用共享内存 LPARAM lParam // second message parameter 如果要传递指针,需要使用共享内存); CreateProcess()通讯有很多技术: 文件, 管道, 共享内存等. 创建进程的时候将自己的相关的参数信息可以作为命令行的参数或者环境变量的参数传递给子进程,子进程接收解析这些参数,利用这些参数给父进程通讯。比如你就可以将父进程的HWND窗口句柄传递过去。 汉字的GB码值范围是多少? HELP:时间差的计算 询问一个关于并口端口控制的问题,谢谢啦! 初级问题,马上结,thank 有关比较的问题? 怎样让基于对话框的程序不闪烁 征询IP包转发器,和转发原理。(高手请指教,急) 如何写naked function的prolog 和 epilog? 请高手解答!!! 快救命啊,我要吐血了。 VS2010调试权限问题 vc向另一个进程发出单击消息出问题了。。。
1.可以采用sendmessage发送WM_COPYDATA消息
2.可以采用socket通信的方式
3.DDX方式
4.剪贴板的数据共享
(第三种我没用过)
但是,进程间通信,用POSTMESSAGE好像挺困难的!如果要用POSTMESSAGE,好像要特别处理,我没有用过;一般用sendmessage,消息自己定义的用起来也非常麻烦,最好用COPYDATA消息!
{
用ShellExecute来运行程序
}
用内存共享方法通信:
数据的生产者
其中data是要通信的数据结构,比如int data[10];int *m_hMapView;
HANDLE m_hMapObject;
int data[10];
#define WM_MYMESSAGE WM_USER + 100
//在数据的消费者创建之前,创建文件视图
BOOL CMyDlg::OnMemFilec()
{
m_hMapObject=::CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,sizeof(data),_T("DataMap"));
if(m_hMapObject==NULL)
{
AfxMessageBox("无法创建文件映射对象");
return false;
}
m_hMapView=(int*)::MapViewOfFile(m_hMapObject,FILE_MAP_WRITE,0,0,0);
if(m_hMapView==NULL)
{
AfxMessageBox("无法创建文件视图");
return false;
}
return true;
}
void CMyDlg::OnTimer(UINT nIDEvent)
{
//用一个定时器给data的成员赋值,并拷贝到文件视图里面
memcpy((void*)m_hMapView,(void*)&data,sizeof(data));
CWnd *pWnd=CWnd::FindWindow(NULL,"进程同步(消费者)"); //用目标进程的窗口的captain来获得窗口句柄
if(pWnd) //如果窗口找到了,发送一个自定义全局消息
{
pWnd->SendMessage(WM_MYMESSAGE , NULL, NULL);
}
}
数据的消费者,从共享内存里面取值
#define WM_MYMESSAGE WM_USER + 100
bool mapopenflag;
LPVOID m_hMapView;
HANDLE m_hMapObject;
int data[10];//在窗口初始化的时候获取文件视图
void CMyDlg::OnMapOpen()
{
if (mapopenflag==false)
{
m_hMapObject=::OpenFileMapping(FILE_MAP_READ,FALSE,_T("DataMap"));
if(m_hMapObject==NULL)
{
AfxMessageBox("无法打开文件映射对象");
return;
}
m_hMapView=::MapViewOfFile(m_hMapObject,FILE_MAP_READ,0,0,0);
if(m_hMapView==NULL)
{
AfxMessageBox("无法获取文件视图");
return;
}
mapopenflag=true;
}
}
LRESULT CMyDlg::OnMyMessage(WPARAM wp, LPARAM lp)//对全局的消息的处理函数
{
if(maphaveopen)
memcpy((void*)&data,(void*)m_hMapView,sizeof(data)); //从共享的内存里面读数据
}具体查一下MSDN
HWND_BROADCAST, // 系统广播
UINT Msg, // 注册自己的message,不然,除child窗口外,其他的所有窗口都会处理这个消息。
WPARAM wParam, // first message parameter 如果要传递指针,需要使用共享内存
LPARAM lParam // second message parameter 如果要传递指针,需要使用共享内存);