共用記憶體入門

來源:互聯網
上載者:User

標籤: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()

函數的功能。

建立並寫資料:

 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

 

共用記憶體入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.