WINCE下进程间通信(一)

在WINCE开发中经常需要在不同的进程之间传递、共享数据,总结了一下,WINCE下进程间通信常用的方式有:Windows消息,共享内存,socket通信,管道,全局原子,邮槽等,下面就分别对这几种方法做个小结。(当然还可以采用注册表,磁盘文件以及数据库方式,只是这几种方式的通信效率和实时性比较低,所以一般不考虑。)

一、Windows消息

        通过Windows消息,可以很方便的在进程与进程之间传递数据。对于传递像字符串这种小的数据,可以直接将字符串以消息参数wParam、lParam的方式传递给其他进程,对于大一点的数据,可以采用发送WM_COPYDATA消息,参考代码如下:

[cpp]  view plain copy
  1. void SendMsg(HWND hwnd,LPVOID lpData,DWORD dwSize)  
  2. {  
  3.     // 填充COPYDATASTRUCT结构  
  4.     COPYDATASTRUCT cpd;  
  5.     cpd.cbData = dwSize;  
  6.     cpd.lpData = lpData;   
  7.       
  8.     // 向指定窗口发送WM_COPYDATA消息,不能用PostMessage方式发送  
  9.     ::SendMessage(hwnd, WM_COPYDATA, NULL,(LPARAM)&cpd);  
  10. }  
  11.   
  12. // 发送端  
  13. TCHAR *data=_T("要发送的内容");  
  14. SendMsg(::FindWindow(NULL,_T("processB")),(void*)data,_tcslen(data)*2);  

在接收端的窗口过程处理函数中添加对WM_COPYDATA消息的处理

[cpp]  view plain copy
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     PAINTSTRUCT ps;  
  4.     HDC hdc;  
  5.     TCHAR data[256]={0};  
  6.       
  7.     switch (message)   
  8.     {  
  9.         case WM_COPYDATA:  
  10.             {  
  11.                 COPYDATASTRUCT *pCopyDataStruct=(COPYDATASTRUCT *)lParam;     
  12.                 memcpy(data,pCopyDataStruct->lpData,pCopyDataStruct->cbData);  
  13.             }  
  14.             break;  
  15.         // ...  
  16.    }  
  17.    return DefWindowProc(hWnd, message, wParam, lParam);  
  18. }  

      需要注意的是在发送数据量较大且数据交换频繁的时候通过发送WM_COPYDATA消息是不可取的,因为当数据传输过于频繁时将有可能导致数据的丢失。

二、共享内存  

      共享内存顾名思义是在内存中创建一个公共区域,供不同的进程间的数据共享。因为是直接对内存进行读写操作,效率非常高,所以共享内存特别适用于大批量的数据传输且实时性要求比较高的场合。

      具体操作步骤如下:

      1.进程A调用CreateFileMapping创建一个内存映射文件。

      2.进程A调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy往内存中拷贝数据。

      3.进程B调用CreateFileMapping打开进程A创建的内存映射文件。

      4.进程B调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy从内存中读出数据。

      5.通信完后进程A,B分别调用UnmapViewOfFile,CloseHandle取消内存映射和关闭内存映射对象句柄。

      为了简化操作,这里封装了一个共享内存操作类,参考代码如下:

      头文件CShareMemory.h:

[cpp]  view plain copy
  1. /******************************************************************* 
  2.  filename: CShareMemory.h 
  3.  purpose:   封装了共享内存操作类 
  4.  author:    firehood 
  5.  created:   2011.03.16 
  6. ********************************************************************/  
  7. #ifndef _SHARE_MEMORY_H  
  8. #define _SHARE_MEMORY_H  
  9.   
  10. class CShareMemory  
  11. {  
  12. public:  
  13.     CShareMemory();  
  14.     ~CShareMemory();  
  15. public:  
  16.     /********************************************************** 
  17.     函数名:Open 
  18.     功能:  创建或打开内存映射文件     
  19.     参数: 
  20.             [in]szMapName:      要创建的共享内存名称 
  21.             [in]dwSize:         创建共享内存的大小 
  22.     返回值: 
  23.             0:      失败 
  24.             1:      创建成功 
  25.             2:      文件已存在 
  26.     ***********************************************************/  
  27.     DWORD Open(LPCTSTR szMapName,DWORD dwSize);  
  28.   
  29.     /********************************************************** 
  30.     函数名:Read 
  31.     功能:  从共享内存指定位置读取数据   
  32.     参数: 
  33.             [out]pBuf:          存放读取的数据 
  34.             [in]dwSize:         读取数据的大小 
  35.             [in]dwOffset        距共享内存起始位置的偏移量 
  36.     返回值: 
  37.             TRUE: 成功 FALSE:失败 
  38.     ***********************************************************/  
  39.     BOOL Read(void* pBuf,DWORD dwSize,DWORD dwOffset = 0);  
  40.   
  41.     /********************************************************** 
  42.     函数名:Write 
  43.     功能:  从共享内存指定位置写入数据   
  44.     参数: 
  45.             [in]pBuf:           待写入的数据指针 
  46.             [in]dwSize:         写入数据的大小 
  47.             [in]dwOffset        距共享内存起始位置的偏移量 
  48.     返回值: 
  49.             TRUE: 失败 FALSE:失败 
  50.     ***********************************************************/  
  51.     BOOL Write(const void* pBuf,DWORD dwSize,DWORD dwOffset = 0);  
  52.     void Close(void);  
  53. private:  
  54.     HANDLE m_hShareMemory;  
  55.     LPVOID m_pMapBuffer;  
  56.     HANDLE m_hAccessMutex;  
  57. };  
  58.   
  59. #endif  
  

      源文件CShareMemory.cpp:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include "CShareMemory.h"  
  3.   
  4. CShareMemory::CShareMemory()  
  5. {  
  6.     m_hShareMemory = NULL;  
  7.     m_pMapBuffer = NULL;  
  8.     m_hAccessMutex =NULL;  
  9. }  
  10.   
  11. CShareMemory::~CShareMemory()  
  12. {  
  13.     Close();  
  14. }  
  15.   
  16. DWORD CShareMemory::Open(LPCTSTR szMapName,DWORD dwSize)  
  17. {  
  18.     DWORD dwRet = 1;  
  19.     if(szMapName == NULL)  
  20.         return 0;  
  21.   
  22.     if(m_hShareMemory)  
  23.     {  
  24.         Close();  
  25.     }   
  26.   
  27.     // 创建内存映射文件对象  
  28.     m_hShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwSize,szMapName);  
  29.     if(!m_hShareMemory)  
  30.     {  
  31.         return 0;  
  32.     }  
  33.     // 内存映射文件对象已存在  
  34.     if(GetLastError() == ERROR_ALREADY_EXISTS)  
  35.     {  
  36.         dwRet = 2;  
  37.     }  
  38.     // 获取内存映射文件指针  
  39.     m_pMapBuffer = MapViewOfFile(m_hShareMemory,FILE_MAP_ALL_ACCESS,0,0,0);  
  40.     if(!m_pMapBuffer)  
  41.     {  
  42.         CloseHandle(m_hShareMemory);  
  43.         return 0;  
  44.     }  
  45.   
  46.     // 创建互斥体,用于读写同步     
  47.     TCHAR szMutexName[MAX_PATH];     
  48.     _tcscpy(szMutexName, szMapName);        
  49.     _tcscat(szMutexName, _T("_Mutex"));       
  50.     m_hAccessMutex=CreateMutex(NULL, FALSE, szMutexName);     
  51.     if(!m_hAccessMutex)  
  52.     {  
  53.         Close();  
  54.         return 0;  
  55.     }     
  56.     return dwRet;  
  57. }  
  58.   
  59. BOOL CShareMemory::Read(void* pBuf,DWORD dwSize,DWORD dwOffset)  
  60. {  
  61.     BOOL bRet;  
  62.     if(!m_pMapBuffer) return FALSE;  
  63.   
  64.     if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)  
  65.     {  
  66.         memcpy(pBuf,(BYTE*)m_pMapBuffer+dwOffset,dwSize);     
  67.         bRet = TRUE;  
  68.     }  
  69.     ReleaseMutex(m_hAccessMutex);  
  70.     return bRet;  
  71. }  
  72.   
  73. BOOL CShareMemory::Write(const void* pBuf,DWORD dwSize,DWORD dwOffset)  
  74. {  
  75.     BOOL bRet;  
  76.     if(!m_pMapBuffer) return FALSE;  
  77.   
  78.     if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)  
  79.     {  
  80.         memcpy((BYTE*)m_pMapBuffer+dwOffset,pBuf,dwSize);  
  81.         bRet = TRUE;  
  82.     }  
  83.     ReleaseMutex(m_hAccessMutex);  
  84.     return TRUE;    
  85. }  
  86.   
  87. void CShareMemory::Close(void)  
  88. {  
  89.     if(m_hShareMemory)  
  90.     {  
  91.         UnmapViewOfFile(m_pMapBuffer);  
  92.         CloseHandle(m_hShareMemory);  
  93.         m_pMapBuffer = NULL;  
  94.         m_hShareMemory = NULL;  
  95.           
  96.     }  
  97.     if(m_hAccessMutex)  
  98.     {  
  99.         CloseHandle(m_hAccessMutex);  
  100.         m_hAccessMutex = NULL;  
  101.     }  
  102. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wince 是微软公司开发的一款嵌入式操作系统,用于小型设备的操作和控制,如移动设备和嵌入式系统等。在 Wince 操作系统中,可以通过批处理脚本来进行一系列的自动化操作,包括查看进程的信息。 要通过批处理脚本来查看 Wince 的进程,可以使用系统提供的命令行工具 tasklist。以下是一个简单的批处理脚本示例: @echo off tasklist 上述脚本首先禁用了命令行的回显功能(通过 @echo off),然后调用了 tasklist 命令。tasklist 命令用于显示当前运行在 Wince 操作系统上的进程列表。当脚本执行时,会在命令行窗口中显示进程的相关信息,包括进程 ID、进程名称、进程状态等。 你也可以使用其他的命令行工具或编写更复杂的批处理脚本来获取进程的更详细信息。例如,可以使用 pslist 命令来显示进程的线程数量、内存使用情况等。此外,你还可以通过编写包含条件判断和循环的批处理脚本来实现更高级的进程管理功能。 需要注意的是,在使用批处理脚本查看进程时,可能需要具备管理员权限或者超级用户权限。否则,可能无法获取全部进程的信息或执行某些操作。如果遇到权限相关的问题,可以尝试切换到具有足够权限的用户或者向系统管理员申请权限。 总之,通过使用批处理脚本,我们可以方便地查看 Wince 操作系统中运行的进程列表和相关信息,从而对系统的运行状态有更好的了解和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值