標籤:處理序間通訊   記憶體對應檔   共用記憶體   mapping file   
IPC處理序間通訊+共用記憶體Mapping      
        IPC(Inter-Process Communication,處理序間通訊)。
        檔案對應(Mapping)是一種將檔案內容映射到記憶體位址的技術,通過對映射記憶體,讀寫檔案如同讀寫記憶體一般簡單。
       多個進程映射同一個檔案對應物件,也即多個進程映射到同一個實體儲存體頁面,因此,當一個進程向映射記憶體寫入資料時,其他進程可以通過映射記憶體讀取資料,通過這個機制實現處理序間通訊。
         
       1.記憶體檔案對應Mapping File :
         A進程建立一個命名的Mapping對象,並在映射記憶體中寫入需要共用的資料。B進程通過對象名開啟Mapping對象,映射該Mapping對象,從映射記憶體中讀取資料。
       2.基本API函數 :
創建Mapping對象:
        HANDLE    CreateFileMapping(
                           HANDLE      hFile,                                   //物理檔案控制代碼
                           LPSECURITY_ATTRIBUTES    lpAttributes, //安全設定
                           DWORD      flProtect,                                      //保護設定
                           DWORD      dwMaximumSizeHigh,         //高位檔案大小
                           DWORD      dwMaximumSizeLow,          //低位檔案大小
                           LPCTSTR   lpName                                   //共用記憶體名稱
);
        該函數返回建立的Mapping對象。
建立映射記憶體:
        LPVOID  MapViewOfFile(
                      HANDLE    hFileMappingObject,               //Mapping對象
                         DWORD     dwDesiredAccess,                        //存取類別
                         DWORD     dwFileOffsetHigh,                  //對應檔高位
                         DWORD     dwFileOffsetLow,                    //對應檔地位
                         SIZE_T        dwNumberOfBytesToMap       //映射位元組數
);
        該函數用於建立Mapping對象的映射記憶體,返回映射記憶體。
記憶體複製:
        VOID  CopyMemory(
                    PVOID Destination,                //要複製記憶體塊的目的地址
                    CONST VOID *Source,              //要複製記憶體塊的源地址
                    SIZE_T Length                                          //複製的位元組數
);
       該函數用於將資料複製到映射記憶體。
開啟Mapping對象:
       HANDLE  OpenFileMapping(
                         DWORD   dwDesiredAccess ,   // 存取許可權
                         BOOL       bInheritHandle ,       //繼承設定,一般設為FALSE
                         LPCTSTR    lpName                  // Mapping對象名
);
      該函數用於開啟一個存在的Mapping對象。返回Mapping物件控點。
  
       3.牛刀小試:
     先在VC6.0中運行process1程式,在運行process2程式:
         運行效果:
process1程式:
process2 程式: