#include #include #include using namespace std; #ifdef WIN32 #include < windows.h> #else //UNIX/Linux version needs -lrt added to CC command #include < sys/types.h> #include < sys/mman.h> #include < sys/fcntl.h> #endif //WIN32 class SharedBuffer { public: SharedBuffer(const char*NameOfMyMapView, int SizeOfBuffer, bool Server = true) :m_NameOfMyMapView(new char[strlen(NameOfMyMapView)+1]), m_Buffer(NULL), m_SizeOfBuffer(SizeOfBuffer),m_MapHandle(0) { strcpy(m_NameOfMyMapView, NameOfMyMapView); #ifdef WIN32 if (Server) { m_MapHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, m_SizeOfBuffer, m_NameOfMyMapView); if (m_MapHandle != INVALID_HANDLE_VALUE) m_Buffer = (char*)MapViewOfFile(m_MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, m_SizeOfBuffer); else m_MapHandle = NULL; } else { m_MapHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, m_NameOfMyMapView); if (m_MapHandle != INVALID_HANDLE_VALUE) m_Buffer = (char*)MapViewOfFile(m_MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, m_SizeOfBuffer); else m_MapHandle = NULL; } #else m_MapHandle = shm_open(m_NameOfMyMapView, O_RDWR|O_CREAT, 0); if (m_MapHandle != -1) { ftruncate(m_MapHandle, m_SizeOfBuffer); m_Buffer = (char*)mmap(NULL, m_SizeOfBuffer, PROT_READ, MAP_SHARED, m_MapHandle , 0); } else m_MapHandle = 0; #endif //WIN32 } ~SharedBuffer() { if (m_MapHandle) { #ifdef WIN32 UnmapViewOfFile(m_Buffer); CloseHandle(m_MapHandle); #else munmap(m_Buffer, m_SizeOfBuffer); shm_unlink(m_NameOfMyMapView); #endif //WIN32 } delete m_NameOfMyMapView; } char* GetBuffer() {return m_Buffer;} private: char* m_NameOfMyMapView; char* m_Buffer; const int m_SizeOfBuffer; bool m_Server; #ifdef WIN32 HANDLE m_MapHandle; #else int m_MapHandle; #endif //WIN32 };