1. 创建共享内存
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
hFile: 共享文件句柄,不创建共享文件,为INVALID_HANDLE_VALUE
lpFileMappingAttributes: 设置为NULL
flProtect: 保护选项,如果指定了hFile,则对文件也有同样的要求
PAGE_READONLY: 只读
PAGE_READWRITE:可读可写
PAGE_WRITECOPY:不支持
dwMaximumSizeHigh: 共享内存大小高32位
dwMaximumSizeLow:共享内存大小低32位
lpName:共享内存名
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
hFileMappingObject: CreateFileMap返回的文件句柄
dwDesiredAccess: 访问权限
FILE_MAP_ALL_ACCESS: 读、写
FILE_MAP_READ:读
FILE_MAP_WRITE:写
dwFileOffsetHigh: 访问偏移量高32位
dwFileOffsetLow:访问偏移量低32位
dwNumberOfBytesToMap: 共享文件字节数,设为0,则为整个文件。
2. 测试代码
2.1 共享内存
服务器端
void SharedMemory()
{
HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
256,
TEXT("MySharedMemory")
);
LPBYTE pcMap = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS,
0, 0, 0);
char *pSharedStr = "0this is my shared memory";
memcpy(pcMap, pSharedStr, strlen(pSharedStr));
while (pcMap[0] == '0')
{
Sleep(100);
}
// 释放内存
UnmapViewOfFile(pcMap);
CloseHandle(hFileMapping);
}
客户端:
void TestSharedMemory()
{
HANDLE hFileMapping;
LPBYTE pcMap;
hFileMapping = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, TEXT("MySharedMemory"));
if(hFileMapping == NULL)
{
return;
}
pcMap = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS,
0, 0, 0);
cout << pcMap << endl;
// 通知主程序释放
pcMap[0] = '1';
// 释放内存
UnmapViewOfFile(pcMap);
CloseHandle(hFileMapping);
}
调试内存:
调试->窗口->内存
2.2 文件共享
服务器端:
void FileSharedMemory()
{
HANDLE hFile = CreateFile(TEXT("Shared.txt"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return;
}
HANDLE hFileMapping = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
TEXT("MySharedMemory")
);
LPBYTE pcMap = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS,
0, 0, 0);
pcMap[0] = '0';
while (pcMap[0] == '0')
{
Sleep(100);
}
// 释放内存
UnmapViewOfFile(pcMap);
CloseHandle(hFileMapping);
CloseHandle(hFile);
}
客户端不变。