创建共享内存
HANDLE CreateFileMapping(
// optional security attributes, 是否被继承
);
hFile // (HANDLE)0xFFFFFFFF 不指定共享内存句柄
lpFileMappingAttributes // 是否被继承
flProtect // 读写权限
dwMaximumSizeHigh
dwMaximumSizeLow // 共享内存大小
lpName // 名字
返回值:
成功:共享内存句柄
返回值:
成功:返回打开 lpName 名字的共享内存地址
HANDLE CreateFileMapping(
// optional security attributes, 是否被继承
);
hFile // (HANDLE)0xFFFFFFFF 不指定共享内存句柄
lpFileMappingAttributes // 是否被继承
flProtect // 读写权限
dwMaximumSizeHigh
dwMaximumSizeLow // 共享内存大小
lpName // 名字
返回值:
成功:共享内存句柄
失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。
映射共享内存地址空间
LPVOID MapViewOfFile(
);
hFileMappingObject : CreateFileMapping 和 OpenFileMapping 返回的句柄
dwDesiredAccess : 存取模式
返回值:
成功:返回映射的地址
失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。
解除映射
BOOL UnmapViewOfFile(
);
返回值:
成功:返回非0
失败:返回0
关闭打开的句柄
BOOL CloseHandle(
);
#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; }打开一个有名的共享内存
返回值:
成功:返回打开 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=0x%08x\r\n",tempaddr); } } UnmapViewOfFile(pRawShareAddr); // 解除映射 pRawShareAddr=NULL; CloseHandle(hShareMem); // 关闭句柄 hShareMem=INVALID_HANDLE_VALUE; getchar(); return 0; }