程序通常被定義為一個正在運作的程式的執行個體,它由兩個部分組成:
一個是作業系統用來管理程序的核心對象。核心對象也是系統用來存放關于程序的統計資訊的地方
另一個是位址空間,它包含所有的可執行子產品或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"); //寫入資料到檔案中
在另一個程序中打開共享檔案并通路資料