windows編程學習——共享內存(一)


#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) 共享內存名稱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章