进程之间的数据传递

来源:互联网 发布:网络教育有没有档案 编辑:程序博客网 时间:2024/06/04 18:13

  随着我们开发的应用的日益复杂,像以往那样将所有功能坐在一个exe文件中情况越来越少,更多时候是整个应用由若干模块、甚至若干单独的exe文件组成,这就涉及到了模块或进程间的通讯交互问题,本文主要谈谈在进程间的信息传递方法,作为进一步探讨进程间通讯方案的参考。

1.使用用户自定义消息在进程间传递消息。

       经过一定时间的Win32开发,大家对Windows Mobile平台下的消息映射机制应该都比较清楚了,除了系统已经为我们设定的如WM_CREATE、WM_PAINT这类消息外,还有一种特殊的WM_USER消息用于用户自定义消息。

定义格式如下:

       #define WM_IAMHANDSOME WM_USER+1                 

然后同样的对于WM_IAMHANDSOME同样的将它映射到相应的处理函数上去。

当需要使用激发该消息时,采用SendMessage函数发送一个WM_IAMHANDSOME即可。下面谈谈在进程间如何进行用户自定义消息的传递。

 

       例,假设两个程序,一个叫zoujielun,一个叫feiyuqing,两个程序进行一项操作,唱一首名叫《千里之外》的歌。

       其中即需要一个程序“唱”完后通知另一个程序接着“唱”。

1)在两个程序中都定义#define WM_YOUTURN WM_USER+10

2)在feiyuqing进程中加入对应WM_YOUTURN的映射:

const MSG_MAP_MAIN_S g_mainMsg[] =

{

       //……

{WM_YOUTURN,OnYouturn},

       //……

};

3)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:

       Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));

           HWND findWindows=NULL;

       findWindows= FindWindow(_T(“feiyuqing”), _T(“feiyuqing"));

           SendMessage(findWindows,WM_YOUTURN,0,0);

这样,即把消息发送给了feiyuqing进程。

4)在feiyuqing中,对应的OnYouTurn做出相应处理即可。

LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)

{

       Sing(_T(“我送你离开千里之外 ……”));

       return 0;

}

    这样即实现了进程间通过自定义消息传递来进行通讯,但是这样的缺点是不能同时传递数据。假设feiyuqing因为年纪大了,如果突然“失忆”了,不记得歌词,需要zoujielun不但告诉他该唱了,还要告诉他该唱什么,这时就需要利用系统一个强大的消息WM_COPYDATA。 

 

2.使用WM_COPYDATA消息跨进程传递数据

       在SDK中,该消息对应的参数为:

    WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;                lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

关键在于第二个参数,即一个COPYDATASTRUCT结构的指针。

该数据结构的结构如下:

typedef struct tagCOPYDATASTRUCT {

  DWORD dwData;

  DWORD cbData;

  PVOID lpData;

} COPYDATASTRUCT;

第一个数据成员可以传递一个DWORD类型,如果只是要在进程间传一个DWORD类型的数据,这里可以直接用这个成员传递。

关键在第二、三个数据成员,第三个lpData即为欲传递的数据的指针,第二个cbData即为传递的数据大小,以byte为单位。

下面举例,还是zoujielun和feiyuqing程序间的通讯。

1)在feiyuqing进程中加入对应WM_COPYDATA的映射:

const MSG_MAP_MAIN_S g_mainMsg[] =

{

       //……

{WM_COPYDATA,OnYouturn},

       //……

};

2)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:

       Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));

     HWND findWindows=NULL;

       findWindows= FindWindow(_T(“feiyuqing"), _T(“feiyuqing"));

       TCHAR *sContent = new TCHAR[256];

       wsprintf(sContent,_T(“我送你离开千里之外……"));

COPYDATASTRUCT copyData;

copyData.cbData = _msize(sContent);

copyData.lpData = sContent;

SendMessage(findWindows,WM_COPYDATA,0,(LPARAM)&copyData);

3)在feiyuqing中,对应的OnOnYouTurn做出相应处理即可。

LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)

{

       TCHAR *sContent = NULL;

            sContent  =(TCHAR*)((COPYDATASTRUCT*)lParam)->lpData;

       Sing(sContent);

       return 0;

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/handsomewang527/archive/2007/07/03/1676259.aspx

原创粉丝点击