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