windows编程学习——共享内存(一)


#include 
#include 

#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) 共享内存名称

你可能感兴趣的:(Windows开发)