首页 > 代码库 > 共享内存入门
共享内存入门
如果想要在两个进程之间进行传输数据,共享内存是其中一个方法。当然个人觉得,共享内存主要的还是用来节约内存。
首先使用下面的函数创建一个新的文件映射内核对象
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 }
打开并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 }
共享内存入门