如果想要在两个进程之间进行传输数据,共享内存是其中一个方法。当然个人觉得,共享内存主要的还是用来节约内存。
首先使用下面的函数创建一个新的文件映射内核对象
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 }
时间: 2024-10-03 01:31:37