#include <stdio.h>
#include <Windows.h>
#define SHAREMEMNAME "ZSShareMem"
int main()
{
DWORD err;
HANDLE hShareMem = INVALID_HANDLE_VALUE;
/*创建一个名字为ZSShareMem的共享内存*/
hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,SHAREMEMNAME);
/*CreateFileMapping()会返回三种错误码:ERROR_FILE_INVALID、ERROR_INVALID_HANDLE、ERROR_ALREADY_EXISTS*/
err = GetLastError(); //获取CreateFileMapping()API的错误返回码
if (hShareMem == INVALID_HANDLE_VALUE || hShareMem == NULL) //判断是否出错
{
printf("共享内存创建失败\n");
}
if (err == ERROR_FILE_INVALID ) //判断是否错误为ERROR_FILE_INVALID
{
printf("企图创建一个零长度的文件映射\n");
}
if (err == ERROR_INVALID_HANDLE ) //判断是否错误为ERROR_INVALID_HANDLE
{
printf("内存空间的命名和现有的内存映射,互斥量,信号量,临界区有同名\n");
}
if (err == ERROR_ALREADY_EXISTS) //判断是否错误为ERROR_ALREADY_EXISTS
{
printf("%s的共享内存已经存在,句柄值为%d\n",SHAREMEMNAME,hShareMem);
}
else
{
printf("%s的共享内存创建成功,句柄值为%d\n",SHAREMEMNAME,hShareMem);
}
getchar();
return 0;
}
HANDLE CreateFileMapping(
HANDLE hFile,//物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect,//保护设置
DWORD dwMaximumSizeHigh,//高位文件大小
DWORD dwMaximumSizeLow,//低位文件大小
LPCTSTR lpName //共享内存名称
);
1) 物理文件句柄hFile
解释: 1. 任何可以获得的物理文件句柄, 如果你需要创建一个物理文件无关的内存映射也无妨, 将它设置成为 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了
2. 如果需要和物理文件关联, 要确保你的物理文件创建的时候的访问模式和"保护设置"匹配,比如: 物理文件只读, 内存映射需要读写就会发生错误。 推荐你的物理文件使用独占方式创建
3. 如果使用 INVALID_HANDLE_VALUE, 也需要设置需要申请的内存空间的大小,无论物理文件句柄参数是否有效,这样CreateFileMapping 就可以创建一个和物理文件大小无关的内存空间给你, 甚至超过实际文件大小, 如果你的物理文件有效,而大小参数为0, 则返回给你的是一个和物理文件大小一样的内存空间地址范围。 返回给你的文件映射地址空间是可以通过复制,集成或者命名得到,初始内容为0
设置值:与物理设备相关:物理文件句柄
创建共享内存:NULL
2)安全设置
解释: windows保护设置
设置值:NULL
3) 保护设置
解释:以哪种方式访问文件
设置值:
PAGE_READONLY 以只读方式打开映射
PAGE_READWRITE 以可读、可写方式打开映射
PAGE_WRITECOPY 为写操作留下备份
可组合使用下述一个或多个常数:
SEC_COMMIT 为文件映射一个小节中的所有页分配内存
SEC_IMAGE 文件是个可执行文件
SEC_RESERVE 为没有分配实际内存的一个小节保留虚拟内存空间
4) 高位文件大小
解释: 32位的机器,设置为0;64位机器按照需求分配空间的大小设置值
设置值:整型数(表示高于32位的位数)
5) 低位文件大小
解释: 低于32位的值的位数
6) 共享内存名称