1. 程式人生 > >Windows程序間通訊之共享記憶體

Windows程序間通訊之共享記憶體

之前自己做的一個專案涉及到程序間通訊問題,我採用的是SOCKET方式。面試的時候有問過為什麼不採用其他方式。好吧,其實發現共享記憶體更方便一點。於是自己寫了一下,並且做了個測試介面。

寫的程式可以在這裡下載下載程式

程式啟動會獲得自身的視窗控制代碼,另外可以輸入一個視窗控制代碼,用於程序間Windows訊息通訊。File Mapping Name實際上就是核心物件名,程序間依據這個來訪問共享記憶體。

Windows下的共享記憶體實際是用檔案對映實現的,可以用CreateFileMapping建立一個記憶體檔案對映物件,用於對映檔案到記憶體。該函式返回的是File Mapping Object控制代碼。

CreateFileMappingA(
    __in     HANDLE hFile,
    __in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
    __in     DWORD flProtect,
    __in     DWORD dwMaximumSizeHigh,
    __in     DWORD dwMaximumSizeLow,
    __in_opt LPCSTR lpName
    );

1)因為並不需要建立一個實際的檔案,所以把hFile設定成為0xFFFFFFFF(INVALID_HANDLE_VALUE)就行了。

2)Windows支援64位的檔案,但一般記憶體不會超過4G也就是32位檔案就夠用了,所以上面的引數當中,dwMaximumSizeHigh為0,dwMaximumSizeLow設定為需要開闢的記憶體大小。

3)lpName用於標示這段記憶體,程序間通過這個標示訪問這段記憶體。

接著呼叫MapViewOfFile()對映到當前程序的虛擬地址上。該函式如果呼叫成功,返回對映檔案的開始地址。如果失敗為NULL。

MapViewOfFile(
    __in HANDLE hFileMappingObject,
    __in DWORD dwDesiredAccess,
    __in DWORD dwFileOffsetHigh,
    __in DWORD dwFileOffsetLow,
    __in SIZE_T dwNumberOfBytesToMap
    );

1)hFileMappingObject就是剛才呼叫CreateFileMapping返回的控制代碼。

2)dwDesiredAccess設定為FILE_MAP_ALL_ACCESS。

3)dwNumberOfBytesToMap,檔案中要對映的位元組數,也就是這塊共享記憶體的大小。


我的程式是這麼呼叫它的。

int Cp1Dlg::MapFile()
{
	CString str;
	m_edit7.GetWindowTextA(str);
	if(str.GetLength() == 0)
	{
		AfxMessageBox("File Mapping Name can't be NULL");
		return -1;
	}
	m_hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		BUF_SIZE,
		str.GetBuffer());
	if(m_hMapFile == NULL)
	{
		AfxMessageBox("CreateFileMapping failed!");
		return 1;
	}
	m_pBuf = static_cast<LPTSTR>(MapViewOfFile(
		m_hMapFile,
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		BUF_SIZE));
	if(m_pBuf == NULL)
	{
		AfxMessageBox("MapViewOfFile failed!");
		CloseHandle(m_hMapFile);
		return 1;
	}
	return 0;
}

接下來就可以對m_pBuf進行寫資料或者讀資料了。

寫資料:

m_edit6.GetWindowTextA(str);
memcpy((void*)m_pBuf, str.GetBuffer(), str.GetLength());
讀資料:
LRESULT Cp1Dlg::OnMsg3(WPARAM wParam, LPARAM lParam){
	CString str;
	str.Format("R:\t%s", m_pBuf);
	m_list2.AddString(str);
	memset((void*)m_pBuf, 0, BUF_SIZE);//讀完之後對這塊記憶體進行清零
	return 0;
}
讀資料我採用的是訊息處理函式。因為當一個程序對記憶體完資料之後,我會發送一個Windows訊息通知另一程序,在其收到這條訊息後就會呼叫函式讀取資料。

比起SOCKET,的確挺方便的。但是如果兩個程序同時對這塊記憶體進行寫資料該怎麼辦呢?這就涉及到程序間同步技術了。不過這個我沒有做。

把資源打包上傳了。

相關推薦

Windows程序通訊共享記憶體

之前自己做的一個專案涉及到程序間通訊問題,我採用的是SOCKET方式。面試的時候有問過為什麼不採用其他方式。好吧,其實發現共享記憶體更方便一點。於是自己寫了一下,並且做了個測試介面。 寫的程式可以在這裡下載下載程式 程式啟動會獲得自身的視窗控制代碼,另外可以輸入一個視

程序通訊共享記憶體

一、共享記憶體的定義和原理 1、共享記憶體的定義   顧名思義,共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之

程序通訊共享記憶體(Share Memory)

為了實現多個程序之間的通訊,我們可以用系統頁面檔案來作為共享記憶體檔案。 1.首先我們建立第一個程序,用系統函式CreateFileMapping建立共享記憶體檔案,用函式MapViewOfFile

程序通訊-共享記憶體Shared Memory--linux核心剖析(十一)

共享記憶體 共享記憶體是程序間通訊中最簡單的方式之一。 共享記憶體是系統出於多個程序之間通訊的考慮,而預留的的一塊記憶體區。 共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當

程序通訊共享記憶體:shm

shm程式碼 #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> struct shm/

程序通訊共享記憶體初步

基本概念 共享記憶體   共享記憶體區是最快的IPC形式。一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再涉及到核心,換句話說是程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。    用管道或者訊息佇列傳遞資料   核心為每

【Qt】Qt程序通訊共享記憶體)【轉】

簡述 上一節中,我們分享下如何利用Windows訊息機制來進行不同程序間的通訊。但是有很多侷限性,比如:不能跨平臺,而且必須兩個程序同時存在才可以,要麼程序A發了訊息誰接收呢? 下面我們來分享另外一種跨平臺的進行間通訊的方式-Shared Memory(共享記憶體)。 簡述 注意事項

Linux程序通訊(七)---共享記憶體shmget()、shmat()、shmdt()及其基礎實驗

概述   可以說,共享記憶體是一種最為高效的程序間通訊方式,因為程序可以直接讀寫記憶體,不需要任何資料的複製。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區,這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。因此,程序就可以直接讀寫這一段記憶體區而不需要進

Linux系統程式設計——程序通訊共享記憶體

概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序都會察覺到這個更改。 共享記憶體的特點: 1)共

程序通訊共享記憶體(程式碼實現)

共享記憶體:1.共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體;                     2.共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種最有效的方式;                     3.不同程序之間共享的記憶體通常安排為同一段

Linux程序通訊——IPC共享記憶體學習筆記

一、什麼是共享記憶體 共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。程序可以將同一段共享記憶體連線到它們自己的地址空間中,所有

Linux程序通訊--mmap共享記憶體(一)

 共享記憶體可以說是最有用的程序間通訊方式,也是最快的IPC形式。兩個不同程序A、B共享記憶體的意思是,同一塊實體記憶體被對映到程序A、B各自的程序地址空間。程序A可以即時看到程序B對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,

Linux (六)程序通訊共享記憶體

上篇部落格我們講了,匿名管道,命名管道,訊息佇列,並使用了他們,初步瞭解了程序間通訊的概念。下面我們要說共享記憶體。 共享記憶體函式 shmget函式 功能:用來建立共享記憶體 原型 int shmget(key_t key,size_t si

Linux環境程序通訊共享記憶體

共享記憶體簡介 共享記憶體允許兩個或多個程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種IPC。共享記憶體的方式有兩種:mmap()系統呼叫和系統V共享記憶體。 mmap()系統呼叫 mmap()系統呼叫使得程序之間通過對映同一個普通

程序通訊方式——共享記憶體

1.什麼是共享記憶體? 共享記憶體就是允許兩個或多個程序共享一定的儲存區。就如同 malloc() 函式向不同程序返回了指向同一個實體記憶體區域的指標。當一個程序改變了這塊地址中的內容的時候,其它程序

程序通訊Linux共享記憶體程式設計

共享記憶體 共享記憶體(Shared Memory)是指多個程序共享一段指定的記憶體空間進行資料互動,三種System V IPC機制(另外兩種是訊號量和訊息佇列)中共享記憶體是速度最快的一種。 共享記憶體機制是最快的一種程序間通訊(Interprocess Commun

Windows程序通訊-共享記憶體

#include "stdafx.h" #include "windows.h" //Name given to the pipe #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe" //Pipe name format - \\.\pipe\pipename

程序通訊共享記憶體

  8.5.1  共享記憶體概述   可以說,共享記憶體是一種最為高效的程序間通訊方式。因為程序可以直接讀寫記憶體,不需要任何資料的複製。為了在多個程序間交換資訊,核心專門留出了一塊記憶體區。這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。因此,程序就可以直接讀寫這一記憶體區而不需要進行資料的

Linux程序通訊POSIX共享記憶體

共享記憶體是最高效的IPC機制,因為它不涉及程序之間的任何資料傳輸。這種高效率帶來的問題是,我們必須用其他輔助手段來同步程序對共享記憶體的訪問,否則會產生競態條件。因此,共享記憶體通常和其他程序間通訊方式一起使用。 Linux下有三種共享記憶體的IPC技術:S

Linux程序通訊訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)

System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和