WINCE下的两种通信方式

来源:互联网 发布:暗黑破坏神2修改器 mac 编辑:程序博客网 时间:2024/04/28 01:20

1.1  WM_COPYDATA方法

       使用WM_COPYDATA消息可以很方便地传递进程间的数据,具体定义如下:

       SendMessagehwndWM_COPYDATAwParamlParam);

其中wParam设置为包含数据的窗体的句柄,lParam指向一个COPYDATASTRUCT的结构:

typedef struct tagCOPYDATASTRUCT {

  DWORD dwData;   //用户定义数据

  DWORD cbData;   //数据大小

  PVOID lpData;     //指向数据的指针

} COPYDATASTRUCT

也就是通过COPYDATASTRUCT的结构来传递数据。

       需要注意的是,WinCE提供的WM_COPYDATA消息来传递进程间的数据,并没有提供同步机制,所以必须要使用SendMessage函数来发送消息,且等待直到对方处理完后返回,而不能使用PostMessage函数来发送WM_COPYDATA

具体过程如下:


首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.

接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.

用WM_COPYDATA的前提:

1,知道接收消息进程的句柄。

2,接收消息进程重载了WM_COPYDATA消息映射,能对其做出反应(否则不是发送端自作多情了?)

看过前提,的出结论:在自己写的两个进程间用WM_COPYDATA再好不过。

下面CODE几行就说明了一切。

获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类,或者名,如果你觉得这样不把握,那就利用SetProp个窗口做个记号....(不说这些,跑踢儿了都)

OK,开始写发送端代码:

HWND hWnd = FindWindow(NULL,"MyApp");

if(hWnd!=NULL)

{

      COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/

      cpd.dwData = 0;

      cpd.cbData = strlen("字符串");

      cpd.lpData = (void*)"字符串";

      ::SendMessage(hWnd,WM_COPYDATANULL,(LPARAM)&cpd);//发送!

      /*完事儿了!!*/

}

接收端重载ON_WM_COPYDATA消息映射函数(下面是手工所要加的,你最好还是用ClassWizard)

afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

ON_WM_COPYDATA()/*消息映射*/

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
        AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/

        return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}


进程通信还有其他一些手段,相对来说比较麻烦,但局限性要比WM_COPYDATA小。当然你也可以两端都注册一个消息来通信。

 

1.2  内存映射文件的方法

       内存映射文件提供了一种完全不同的读写文件的方法,它是将文件内容映射到内存的某个区域,读写文件直接操作内存即可。下面介绍内存映射文件所需的API函数:

1 创建用于内存映射访问的文件

       WinCE中,要想创建或打开一个用于内存映射访问的文件,需要通过CreateFileForMapping函数来实现,它是CreateFile函数的一个特殊版本,专门提供给内存映射文件使用,CreateFileForMapping函数的定义如下:

HANDLE CreateFileForMapping (

  LPCTSTR lpFileName,

  DWORD dwDesiredAccess,

  DWORD dwShareMode,

  LPSECURITY_ATTRIBUTES lpSecurityAttributes,

  DWORD dwCreationDisposition,

  DWORD dwFlagsAndAttributes,

  HANDLE hTemplateFile );

 

2 创建或打开内存映射文件对象

       在使用内存映射文件时,需要创建或打开内存映射文件对象,它实际上是于已经创建或打开的文件建立连接。创建或打开内存映射对象通过CreateFileMapping函数实现,此函数定义如下:

HANDLE CreateFileMapping(  HANDLE hFile,   LPSECURITY_ATTRIBUTES lpFileMappingAttributes,   DWORD flProtect,   DWORD dwMaximumSizeHigh,   DWORD dwMaximumSizeLow,   LPCTSTR lpName );

);

       成功创建内存映射文件对象,函数将返回一个内存映像对象句柄,如果在创建内存映射文件对象已存在,将直接返回已打开的内存映像文件对象句柄。

3 获取内存映像文件对象视图

       当创建或打开了内存映射对象之后。接着就需要得到内存映射文件对象的数据内存指针,通过此指针则可以读写文件中的内容,也就是获取内存映射文件对象视图。得到内存映射文件对象的数据内存指针通过MapViewOfFile函数实现,此函数定义如下:

LPVOID MapViewOfFile(   HANDLE hFileMappingObject,   DWORD dwDesiredAccess,   DWORD dwFileOffsetHigh,   DWORD dwFileOffsetLow,   DWORD dwNumberOfBytesToMap );

 

函数返回值指向映射文件的内存指针。

4 取消文件视图的映射

       在使用完内存映射文件之后,还要调用UnmapViewOfFile函数取消文件视图,进行内存清理工作。此函数定义如下:

BOOL UnmapViewOfFile(
  LPCVOID lpBaseAddress
);
 

这是继承通信时用到的主要函数

 

原创粉丝点击