共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。
函数API
HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName );
|
LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap );
|
HANDLE OpenFileMapping( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName );
|
进行内存映射文件的读写
if ( m_pViewOfFile ) { TCHAR s[dwMemoryFileSize]; lstrcpy(s, (LPCTSTR) m_pViewOfFile); }
if ( m_pViewOfFile ) { TCHAR s[dwMemoryFileSize]; m_edit_box.GetWindowText(s, dwMemoryFileSize); lstrcpy( (LPTSTR) m_pViewOfFile, s); ::PostMessage(HWND_BROADCAST, wm_Message, (WPARAM) m_hWnd, 0); }
|
清理内核对象
UnmapViewOfFile(pLocalMem); pLocalMem=NULL; CloseHandle(hFileMapping);
|
完整代码 实现:每打开一个程序,计数加一。
#include <iostream> #include <Windows.h> using namespace std;
int main() { HANDLE hMap; PINT lpMapAddr;
hMap = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, "LYSM_Map" ); if (NULL == hMap) { hMap = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, "LYSM_Map" ); if (NULL == hMap) { goto end; } lpMapAddr = (PINT)MapViewOfFile( hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); *lpMapAddr = 1; }
lpMapAddr = (PINT)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
cout << "instance's count : " << *lpMapAddr << endl;
*lpMapAddr = *lpMapAddr + 1;
cout << "finished." << endl; getchar(); end: if (hMap) CloseHandle(hMap); getchar(); return 0; }
|
