失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。
映射共享内存地址空间LPVOID MapViewOfFile( HANDLE hFileMappingObject, // file-mapping object to map into address space DWORD dwDesiredAccess, // access mode DWORD dwFileOffsetHigh, // high-order 32 bits of file offset DWORD dwFileOffsetLow, // low-order 32 bits of file offset DWORD dwNumberOfBytesToMap // number of bytes to map);hFileMappingObject : CreateFileMapping 和 OpenFileMapping 返回的句柄dwDesiredAccess : 存取模式返回值:成功:返回映射的地址
失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。
解除映射BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // address where mapped view begins ,MapViewOfFile 的句柄 );返回值:成功:返回非0
失败:返回0
关闭打开的句柄BOOL CloseHandle( HANDLE hObject // handle to object to close
);
例程 创建共享内存
#include <Windows.h> #include <cstdio> static HANDLE hShareMem = INVALID_HANDLE_VALUE; static void * pRawShareAddr = NULL; int main(int argc, char **argv) { int nMemSize = 1024; hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, nMemSize, NULL); if( (hShareMem != INVALID_HANDLE_VALUE) && (hShareMem != NULL) ) { pRawShareAddr = (void *)MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); memset(pRawShareAddr, 0, nMemSize); // 清空数据 } UnmapViewOfFile(pRawShareAddr); // 解除映射 pRawShareAddr=NULL; CloseHandle(hShareMem); // 关闭句柄 hShareMem=INVALID_HANDLE_VALUE; getchar(); return 0; } 打开一个有名的共享内存 HANDLE OpenFileMapping( DWORD dwDesiredAccess, // access mode BOOL bInheritHandle, // inherit flag LPCTSTR lpName // pointer to name of file-mapping object ); 返回值: 成功:返回打开 lpName 名字的共享内存地址失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。
例程 获取共享内存
#include <Windows.h> #include <cstdio> static HANDLE hShareMem = INVALID_HANDLE_VALUE; static void * pRawShareAddr = NULL; int main(int argc, char **argv) { int nMemSize = 1024; char sShareMemName[] = "shareMemName"; hShareMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, (LPCTSTR)sShareMemName); if( (hShareMem != INVALID_HANDLE_VALUE) && (hShareMem != NULL) ) { pRawShareAddr = (void *)MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (pRawShareAddr != NULL) { unsigned long long tempaddr=(unsigned long long)pRawShareAddr; printf("get_share_mem: windows shm addr=0xx\r\n",tempaddr); } } UnmapViewOfFile(pRawShareAddr); // 解除映射 pRawShareAddr=NULL; CloseHandle(hShareMem); // 关闭句柄 hShareMem=INVALID_HANDLE_VALUE; getchar(); return 0; }