在WINCE開發(fā)中經(jīng)常需要在不同的進(jìn)程之間傳遞、共享數(shù)據(jù),總結(jié)了一下,WINCE下進(jìn)程間通信常用的方式有:Windows消息,共享內(nèi)存,socket通信,管道,全局原子,郵槽等,下面就分別對這幾種方法做個(gè)小結(jié)。(當(dāng)然還可以采用注冊表,磁盤文件以及數(shù)據(jù)庫方式,只是這幾種方式的通信效率和實(shí)時(shí)性比較低,所以一般不考慮。)
一、Windows消息
通過Windows消息,可以很方便的在進(jìn)程與進(jìn)程之間傳遞數(shù)據(jù)。對于傳遞像字符串這種小的數(shù)據(jù),可以直接將字符串以消息參數(shù)wParam、lParam的方式傳遞給其他進(jìn)程,對于大一點(diǎn)的數(shù)據(jù),可以采用發(fā)送WM_COPYDATA消息,參考代碼如下:
- void SendMsg(HWND hwnd,LPVOID lpData,DWORD dwSize)
- {
-
- COPYDATASTRUCT cpd;
- cpd.cbData = dwSize;
- cpd.lpData = lpData;
-
-
- ::SendMessage(hwnd, WM_COPYDATA, NULL,(LPARAM)&cpd);
- }
-
-
- TCHAR *data=_T("要發(fā)送的內(nèi)容");
- SendMsg(::FindWindow(NULL,_T("processB")),(void*)data,_tcslen(data)*2);
在接收端的窗口過程處理函數(shù)中添加對WM_COPYDATA消息的處理
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT ps;
- HDC hdc;
- TCHAR data[256]={0};
-
- switch (message)
- {
- case WM_COPYDATA:
- {
- COPYDATASTRUCT *pCopyDataStruct=(COPYDATASTRUCT *)lParam;
- memcpy(data,pCopyDataStruct->lpData,pCopyDataStruct->cbData);
- }
- break;
-
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
需要注意的是在發(fā)送數(shù)據(jù)量較大且數(shù)據(jù)交換頻繁的時(shí)候通過發(fā)送WM_COPYDATA消息是不可取的,因?yàn)楫?dāng)數(shù)據(jù)傳輸過于頻繁時(shí)將有可能導(dǎo)致數(shù)據(jù)的丟失。
二、共享內(nèi)存
共享內(nèi)存顧名思義是在內(nèi)存中創(chuàng)建一個(gè)公共區(qū)域,供不同的進(jìn)程間的數(shù)據(jù)共享。因?yàn)槭侵苯訉?nèi)存進(jìn)行讀寫操作,效率非常高,所以共享內(nèi)存特別適用于大批量的數(shù)據(jù)傳輸且實(shí)時(shí)性要求比較高的場合。
具體操作步驟如下:
1.進(jìn)程A調(diào)用CreateFileMapping創(chuàng)建一個(gè)內(nèi)存映射文件。
2.進(jìn)程A調(diào)用MapViewOfFile獲取到映射到文件的內(nèi)存起始地址,調(diào)用memcpy往內(nèi)存中拷貝數(shù)據(jù)。
3.進(jìn)程B調(diào)用CreateFileMapping打開進(jìn)程A創(chuàng)建的內(nèi)存映射文件。
4.進(jìn)程B調(diào)用MapViewOfFile獲取到映射到文件的內(nèi)存起始地址,調(diào)用memcpy從內(nèi)存中讀出數(shù)據(jù)。
5.通信完后進(jìn)程A,B分別調(diào)用UnmapViewOfFile,CloseHandle取消內(nèi)存映射和關(guān)閉內(nèi)存映射對象句柄。
為了簡化操作,這里封裝了一個(gè)共享內(nèi)存操作類,參考代碼如下:
頭文件CShareMemory.h:
-
-
-
-
-
-
- #ifndef _SHARE_MEMORY_H
- #define _SHARE_MEMORY_H
-
- class CShareMemory
- {
- public:
- CShareMemory();
- ~CShareMemory();
- public:
-
-
-
-
-
-
-
-
-
-
-
- DWORD Open(LPCTSTR szMapName,DWORD dwSize);
-
-
-
-
-
-
-
-
-
-
-
- BOOL Read(void* pBuf,DWORD dwSize,DWORD dwOffset = 0);
-
-
-
-
-
-
-
-
-
-
-
- BOOL Write(const void* pBuf,DWORD dwSize,DWORD dwOffset = 0);
- void Close(void);
- private:
- HANDLE m_hShareMemory;
- LPVOID m_pMapBuffer;
- HANDLE m_hAccessMutex;
- };
-
- #endif
源文件CShareMemory.cpp:
- #include "stdafx.h"
- #include "CShareMemory.h"
-
- CShareMemory::CShareMemory()
- {
- m_hShareMemory = NULL;
- m_pMapBuffer = NULL;
- m_hAccessMutex =NULL;
- }
-
- CShareMemory::~CShareMemory()
- {
- Close();
- }
-
- DWORD CShareMemory::Open(LPCTSTR szMapName,DWORD dwSize)
- {
- DWORD dwRet = 1;
- if(szMapName == NULL)
- return 0;
-
- if(m_hShareMemory)
- {
- Close();
- }
-
-
- m_hShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwSize,szMapName);
- if(!m_hShareMemory)
- {
- return 0;
- }
-
- if(GetLastError() == ERROR_ALREADY_EXISTS)
- {
- dwRet = 2;
- }
-
- m_pMapBuffer = MapViewOfFile(m_hShareMemory,FILE_MAP_ALL_ACCESS,0,0,0);
- if(!m_pMapBuffer)
- {
- CloseHandle(m_hShareMemory);
- return 0;
- }
-
-
- TCHAR szMutexName[MAX_PATH];
- _tcscpy(szMutexName, szMapName);
- _tcscat(szMutexName, _T("_Mutex"));
- m_hAccessMutex=CreateMutex(NULL, FALSE, szMutexName);
- if(!m_hAccessMutex)
- {
- Close();
- return 0;
- }
- return dwRet;
- }
-
- BOOL CShareMemory::Read(void* pBuf,DWORD dwSize,DWORD dwOffset)
- {
- BOOL bRet;
- if(!m_pMapBuffer) return FALSE;
-
- if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)
- {
- memcpy(pBuf,(BYTE*)m_pMapBuffer+dwOffset,dwSize);
- bRet = TRUE;
- }
- ReleaseMutex(m_hAccessMutex);
- return bRet;
- }
-
- BOOL CShareMemory::Write(const void* pBuf,DWORD dwSize,DWORD dwOffset)
- {
- BOOL bRet;
- if(!m_pMapBuffer) return FALSE;
-
- if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)
- {
- memcpy((BYTE*)m_pMapBuffer+dwOffset,pBuf,dwSize);
- bRet = TRUE;
- }
- ReleaseMutex(m_hAccessMutex);
- return TRUE;
- }
-
- void CShareMemory::Close(void)
- {
- if(m_hShareMemory)
- {
- UnmapViewOfFile(m_pMapBuffer);
- CloseHandle(m_hShareMemory);
- m_pMapBuffer = NULL;
- m_hShareMemory = NULL;
-
- }
- if(m_hAccessMutex)
- {
- CloseHandle(m_hAccessMutex);
- m_hAccessMutex = NULL;
- }
- }