1. 程式人生 > >windows程式設計學習——共享記憶體(一)

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) 共享記憶體名稱

相關推薦

windows程式設計學習——共享記憶體()

#include <stdio.h> #include <Windows.h> #define SHAREMEMNAME "ZSShareMem" int main() { DWORD err; HANDLE hShareMem = INV

windows程式設計學習——共享記憶體(二)

#include <stdio.h> #include <Windows.h> #define SHAREMEMNAME "ZSShareMem" int main() {

Linux環境程式設計共享記憶體區():共享記憶體區簡介

共享記憶體區是可用IPC形式中最快的。一旦記憶體區對映到共享它的程序的地址空間,程序間資料的傳遞就不再涉及核心。然而往該共享記憶體區存放資訊或從中取走資訊的程序間通常需要某種形式的同步。不再涉及核心是指:程序不再通過執行任何進入核心的系統呼叫來彼此傳遞資料。核心必須建立允許

Windows高階程式設計學習筆記(

寫在前面的話 之前學的Windows程式設計都是介面啊、網路程式設計啊之類的純應用層面的東西,總是感覺而自己沒有達到自己期望中的水平。什麼水平呢?如果讓你編寫監控系統資源的工具,或者DLL注入相關軟體,或者底層安全軟體,可以勝任嗎?我的答案是,並不會。

Excel中VBA程式設計學習筆記(

1、註釋及編碼規則 註釋: 單引號:可以位於句子結尾或者單獨一行; Rem:單獨一行   編碼規則: 如果VB中的關鍵字是由多個英文字母組成,則系統自動將每個單詞的首字母轉換成大寫字母,其餘字母一律轉換成小寫字母。 對於使用者自定義的變數名、

java丨事件驅動程式設計學習筆記(

一、事件和事件源 事件:事件可以定義為程式發生了某些事情的訊號 源物件(源元件):能建立一個事件並觸發該事件的元件成為源物件 事件類的根類:java.util.EventObject 可以使用EventObject類中的例項方法getSource()獲得事件的源物件 如果一

linux網路程式設計學習筆記(

目錄 1. 獲取系統呼叫錯誤資訊:errno   strerror()     perror(); 他跟c語言中的fopen()有什麼區別呢?  他也呼叫的是這個open(); 2.常規檔案操作之建立、讀、寫

Java 多執行緒程式設計學習總結(

定義篇 程序(Process)和執行緒(Thread) 怎樣實現多工處理(Multitasking)? 多工處理是同時執行多個任務的過程。我們使用多工處理來利用 CPU。可通過兩種方式實現多工處理: · 基於程序的多工 (多重處理) · 基於執行緒的多工處理

shell程式設計學習筆記(

導讀 注意,這篇部落格是記錄博主學習的筆記,撰寫風格可能不適合沒有程式設計基礎的讀者。 變數 定義 不需要宣告型別,只需要加賦值號(=) 輸入 輸出 name=’hemim’ echo $name hemim 只能以數字和下劃線開頭,如:

java 併發程式設計學習筆記()之 併發基礎

                                              併發基礎 併發小測試 java.util.concurrent.Semaphore 類 public class SemTest { /** * Se

java 併發程式設計學習筆記()之 基礎框架搭建和併發模擬工具,程式碼

                                基礎框架搭建和併發模擬工具,程式碼 (1)基礎框架搭建 (2)併發模擬 (3)CountDownLatch  通常用來 保證 幾個執行緒執行完成之後,再執行其他的程式碼 Semaphore

伺服器開發之linux網路程式設計---學習章節(

前言:    近期學習了伺服器相關的開發,平常主要擼c的程式,所以就下定決心研究了c的伺服器開發,目的也在與鞏固c的基本知識。詳細分享如下,若有錯誤請指正,希望與大家探討,共同學習進步。                                             

windows程式設計學習札記

2013.10.05 3.基於對話方塊的程式設計中關於為控制元件中的按鈕新增鍵盤快捷鍵的一些問題 如果只是建立基於對話方塊的工程,那麼會在WinMain中沒有入口進入訊息迴圈(始終在DialogBox中執行),也就無法執行TranslateAccelarators,快捷鍵自然無法使用。也就是說,建立工程時,仍

windows程式設計學習——獲取系統資訊

(1) GetSystemInfo函式 功能:返回關於當前系統的資訊。 函式原型: void WINAPI GetSystemInfo ( _Out_ LPSYSTEM_INFO lpSystemInfo//LPSYSTEM_INFO結構體指標 );     SYSTEM_I

Socket程式設計學習筆記(

一、什麼是Socket程式設計: socket是一種最簡單的客戶機/伺服器通訊模式。即客戶程序向伺服器程序發出某種服務請求,伺服器響應該請求。如圖所示,同常,一個伺服器程序會同時為多個客戶程序服務,圖中的伺服器程序B1同時為客戶程序A1、A2和B2提供服務。

windows程式設計學習——多媒體時鐘

以下是使用多媒體計數器時涉及的函式 (1)DWORD   timeGetTime(void)          返回從Windows啟動開始經過的毫秒數 (2)timeSetEvent( UINT uDelay,        UINT uResolution,       

windows程式設計學習——互斥物件

對於互斥物件的操作包括: (1)建立互斥物件(CreateMutex) CreateMutex函式 功能: 建立互斥量來確保一個執行緒獨佔對一個資源的訪問。互斥量物件包含一個使用計數、執行緒ID 以及一個遞迴計數。執行緒ID用來標識當前佔用這個互斥量的是系統中的那個執行緒,遞

Windows程式設計學習筆記(三)——視窗和訊息

MessageBox函式會建立一個‘視窗’。在Windows中,一個視窗就是螢幕上一個矩形區域,它接收使用者的輸入並以文字或圖形的格式顯示輸出內容。MessageBox函式建立一個視窗,但只是一個功能有

組合語言程式設計學習筆記()(Linux 版)

參考《組合語言程式設計》 1.每條指令碼都是從記憶體中讀取的,指令碼所需的資料也是儲存在記憶體中並從記憶體中讀取。 包含指令碼的記憶體位元組和包含處理器所用的資料的位元組沒有區別。 2.區分資料和指令碼--資料指標和指令指標。 3.資料指標幫助處理器瞭解記憶體中資料區域的起

windows程式設計學習筆記-裝置無關點陣圖

GIF,JPEG格式壓縮了影象資料。DIB一般都不壓縮。 Windows API直接支援DIB。 DIB提供了一個用來交換影象的檔案格式。 Windows應用程式用到的點陣圖一般作為DIB,存在可執行檔案的只讀資源中。 程式可把DIB檔案除去開始的14位