首页 > 代码库 > 共享内存入门

共享内存入门

如果想要在两个进程之间进行传输数据,共享内存是其中一个方法。当然个人觉得,共享内存主要的还是用来节约内存。

首先使用下面的函数创建一个新的文件映射内核对象

HANDLE CreateFileMapping(
  HANDLE hFile,                               //物理文件句柄
  LPSECURITY_ATTRIBUTES lpAttributes,  //安全设置
  DWORD flProtect,                            //保护设置
  DWORD dwMaximumSizeHigh,              //高位文件大小
  DWORD dwMaximumSizeLow,                //低位文件大小
  LPCTSTR lpName                                  //共享内存名称
);

然后用

LPVOID   MapViewOfFile(

  HANDLE   hFileMappingObject,  
  DWORD   dwDesiredAccess,  
  DWORD   dwFileOffsetHigh,  
  DWORD   dwFileOffsetLow,  
  DWORD   dwNumberOfBytesToMap

);

将一个文件映射对象映射到当前应用程序的地址空间。

之后就可以对MapViewOfFile()返回的值进行操作了。

值得注意的是:CreateFileMapping()创建的映射对象本来就存在的话,那么该函数相当于执行了OpenFileMapping()

函数的功能。

创建并写数据:

 1         LPVOID lpShareMem = NULL; 2         // appの名前をチェック 3         if (lstrcmpi(szExeName, "SsView") == 0) 4         { 5             g_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "PDFLibShare"); 6             if (g_hMapFile == NULL) 7             { 8                 g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MAX_PATH, "PDFLibShare"); 9             }10             if(g_hMapFile != NULL)11             {12                 // 共有メモリに書き込み13                 lpShareMem = MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);14                 if (lpShareMem != NULL)15                 {16                     //if (g_szDocAddress == NULL || g_szDocAddress[0] == ‘\0‘)17                     {18                         char szShareMem[MAX_PATH] = {0};19                         memcpy(g_szDocAddress, (char*)m_pdCurrentDoc, strlen((char*)m_pdCurrentDoc));20                         memcpy(szShareMem, m_szCurrentFilePath, strlen(m_szCurrentFilePath));21                         vector<char*> *wrk_vectorShareMem = (vector<char*>*)lpShareMem;22                         wrk_vectorShareMem->push_back(szShareMem);23                     }24                 }25             }26         }27         // メモリ解放28         if (lpShareMem != NULL)29         {30             UnmapViewOfFile(lpShareMem);31             lpShareMem = NULL;32         }
View Code


打开并check数据:

 1         if (lstrcmpi(szExeName, "PfuSsOrg") == 0) 2         { 3             hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "PDFLibShare"); 4             if(hMapFile != NULL) 5             { 6                 // 共有メモリのチェック 7                 lpShareMem = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 8                 char *szShareMem = (char*)lpShareMem; 9                 if (lstrcmpi(szShareMem, m_szCurrentFilePath) == 0)10                 {11                     if (lpShareMem != NULL)12                     {13                         UnmapViewOfFile(lpShareMem);14                         lpShareMem = NULL;15                     }16                     if (hMapFile != NULL)17                     {18                         CloseHandle(hMapFile);19                         hMapFile = NULL;20                     }21                     return 13; // SsViewで開ける22                 }23             }24         }
View Code

 

共享内存入门