天天看點

windows 程序間通信(共享記憶體)

程序通常被定義為一個正在運作的程式的執行個體,它由兩個部分組成:

       一個是作業系統用來管理程序的核心對象。核心對象也是系統用來存放關于程序的統計資訊的地方

      另一個是位址空間,它包含所有的可執行子產品或DLL子產品的代碼和資料。它還包含動态配置設定的空間。如線程堆棧和堆配置設定空間。每個程序被賦予它自己的虛拟位址空間,當程序中的一個線程正在運作時,該線程可以通路隻屬于它的程序的記憶體。屬于其它程序的記憶體則是隐藏的,并不能被正在運作的線程通路。

   為了能在兩個程序之間進行通訊,我們可以通過下面的方法來實作:

2。使用共享記憶體方式(Shared Memory)

   a.設定一塊共享記憶體區域          

     HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD,  LPCSTR)

     産生一個file-mapping核心對象

     LPVOID MapViewOfFile(

         HANDLE hFileMappingObject,

         DWORD  dwDesiredAcess,

         DWORD  dwFileOffsetHigh,

         DWORD  dwFileOffsetLow,

         DWORD  dwNumberOfBytesToMap

     );

    得到共享記憶體的指針

   b.找出共享記憶體

    決定這塊記憶體要以點對點(peer to peer)的形式呈現

        每個程序都必須有相同的能力,産生共享記憶體并将它初始化。每個程序

        都應該調用CreateFileMapping(),然後調用GetLastError().如果傳回的

        錯誤代碼是ERROR_ALREADY_EXISTS,那麼程序就可以假設這一共享記憶體區         域已經被别的程序打開并初始化了,否則該程序就可以合理的認為自己 排在第          一位,并接下來将共享記憶體初始化。

    還是要使用client/server架構中

       隻有server程序才應該産生并初始化共享記憶體。所有的程序都應該使用

HANDLE OpenFileMapping(DWORD dwDesiredAccess,

                                   BOOL bInheritHandle,

                                   LPCTSTR lpName);

        再調用MapViewOfFile(),取得共享記憶體的指針

   c.同步處理(Mutex)

   d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

                        CloseHandle()

這個建立記憶體共享我覺得是最簡單的方法:

代碼實作

在一個程序中建立共享檔案

HANDLE lhShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"penghao");
	if (lhShareMemory !=NULL)
	{
		//AfxMessageBox("共享資料打開成功!");
	}

	char * strBuffer;
	strBuffer = (char * ) MapViewOfFile(lhShareMemory,FILE_MAP_WRITE,0,0,1024);//擷取檔案位址
	strcpy(strBuffer,"update"); //寫入資料到檔案中           

在另一個程序中打開共享檔案并通路資料