码迷,mamicode.com
首页 > 其他好文 > 详细

共享内存入门

时间:2014-12-16 18:45:55      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   ar   color   os   使用   sp   

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

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

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()

函数的功能。

创建并写数据:

bubuko.com,布布扣
 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数据:

bubuko.com,布布扣
 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

 

共享内存入门

标签:des   style   blog   http   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/fengzstrong/p/4167584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!