国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
WINCE下進(jìn)程間通信(一) .
 在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消息,參考代碼如下:

  1. void SendMsg(HWND hwnd,LPVOID lpData,DWORD dwSize)  
  2. {  
  3.     // 填充COPYDATASTRUCT結(jié)構(gòu)   
  4.     COPYDATASTRUCT cpd;  
  5.     cpd.cbData = dwSize;  
  6.     cpd.lpData = lpData;   
  7.       
  8.     // 向指定窗口發(fā)送WM_COPYDATA消息,不能用PostMessage方式發(fā)送   
  9.     ::SendMessage(hwnd, WM_COPYDATA, NULL,(LPARAM)&cpd);  
  10. }  
  11.   
  12. // 發(fā)送端   
  13. TCHAR *data=_T("要發(fā)送的內(nèi)容");  
  14. SendMsg(::FindWindow(NULL,_T("processB")),(void*)data,_tcslen(data)*2);  

在接收端的窗口過程處理函數(shù)中添加對WM_COPYDATA消息的處理

  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. }  

      需要注意的是在發(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:

  1. /******************************************************************* 
  2.  filename: CShareMemory.h 
  3.  purpose:   封裝了共享內(nèi)存操作類 
  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.     函數(shù)名:Open 
  18.     功能:  創(chuàng)建或打開內(nèi)存映射文件     
  19.     參數(shù): 
  20.             [in]szMapName:      要創(chuàng)建的共享內(nèi)存名稱 
  21.             [in]dwSize:         創(chuàng)建共享內(nèi)存的大小 
  22.     返回值: 
  23.             0:      失敗 
  24.             1:      創(chuàng)建成功 
  25.             2:      文件已存在 
  26.     ***********************************************************/  
  27.     DWORD Open(LPCTSTR szMapName,DWORD dwSize);  
  28.   
  29.     /********************************************************** 
  30.     函數(shù)名:Read 
  31.     功能:  從共享內(nèi)存指定位置讀取數(shù)據(jù)   
  32.     參數(shù): 
  33.             [out]pBuf:          存放讀取的數(shù)據(jù) 
  34.             [in]dwSize:         讀取數(shù)據(jù)的大小 
  35.             [in]dwOffset        距共享內(nèi)存起始位置的偏移量 
  36.     返回值: 
  37.             TRUE: 成功 FALSE:失敗 
  38.     ***********************************************************/  
  39.     BOOL Read(void* pBuf,DWORD dwSize,DWORD dwOffset = 0);  
  40.   
  41.     /********************************************************** 
  42.     函數(shù)名:Write 
  43.     功能:  從共享內(nèi)存指定位置寫入數(shù)據(jù)   
  44.     參數(shù): 
  45.             [in]pBuf:           待寫入的數(shù)據(jù)指針 
  46.             [in]dwSize:         寫入數(shù)據(jù)的大小 
  47.             [in]dwOffset        距共享內(nèi)存起始位置的偏移量 
  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:

  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.     // 創(chuàng)建內(nèi)存映射文件對象   
  28.     m_hShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwSize,szMapName);  
  29.     if(!m_hShareMemory)  
  30.     {  
  31.         return 0;  
  32.     }  
  33.     // 內(nèi)存映射文件對象已存在   
  34.     if(GetLastError() == ERROR_ALREADY_EXISTS)  
  35.     {  
  36.         dwRet = 2;  
  37.     }  
  38.     // 獲取內(nèi)存映射文件指針   
  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.     // 創(chuàng)建互斥體,用于讀寫同步      
  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.     }  
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
管理進(jìn)程的虛擬內(nèi)存
《Windows核心編程系列》十三談?wù)勗趹?yīng)用程序中使用虛擬內(nèi)存
[Win32] DLL注入技術(shù)
VirtualAlloc的正確用法
如何限制PC機(jī)上網(wǎng)
VC通過HTTP方式獲取網(wǎng)頁
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服