#include "CShareMemManager.h" //bool IsWin9X() //{ // OSVERSIONINFO SysOSVersionInfo; // SysOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // GetVersionEx(&SysOSVersionInfo); // if (SysOSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) // return true; // else // return false; //} //bool IsWinNT() //{ // OSVERSIONINFO SysOSVersionInfo; // SysOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // GetVersionEx(&SysOSVersionInfo); // if (SysOSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) // return true; // else // return false; //} CShareMem::CShareMem(std::string MemName) { m_ShareMemHandle = NULL; m_ShareMemMapHandle = NULL; m_ShareMemAddr = NULL; m_ShareMemName = MemName; m_ShareMemSize = 0; } CShareMem::~CShareMem() { CloseShareMemMap(); if(m_ShareMemHandle == NULL) return; if(! CloseHandle(m_ShareMemHandle)) return; m_ShareMemHandle = NULL; } //CreatShareMem函数创建共享内存 //参数ShareMemLen为共享内存的大小(字节为单位) bool CShareMem::CreateShareMem(DWORD ShareMemLen) { //SECURITY_ATTRIBUTES SecurityAttributes; //SECURITY_DESCRIPTOR SecurityDescriptor; HANDLE _ShareMemHandle = NULL; //InitializeSecurityDescriptor(&SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); //SetSecurityDescriptorDacl(&SecurityDescriptor, true, NULL, false); //SecurityAttributes.nLength = sizeof(SecurityAttributes); //SecurityAttributes.lpSecurityDescriptor = &SecurityDescriptor; //SecurityAttributes.bInheritHandle = true; _ShareMemHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, ShareMemLen, m_ShareMemName.c_str()); m_ShareMemHandle = _ShareMemHandle; m_ShareMemSize = ShareMemLen; if ((_ShareMemHandle != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) { OutputDebugString("_ShareMemHandle != NULL && GetLastError() == ERROR_ALREADY_EXISTS----------------------"); return true; } if (_ShareMemHandle == NULL) { OutputDebugString("Create sharememory fail! _ShareMemHandle is null!----------------------"); return false; } return true; } DWORD CShareMem::GetShareMemSize() { return m_ShareMemSize; } //OpenShareMem函数打开共享内存 bool CShareMem::OpenShareMemMap() { if((m_ShareMemMapHandle != NULL)&&(m_ShareMemAddr != NULL)) return true; HANDLE _ShareMemMapHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS,false,m_ShareMemName.c_str()); if (_ShareMemMapHandle == NULL) { OutputDebugString("Can not open sharememory, _ShareMemMapHandle is null!----------------------"); DWORD ErrorCode = GetLastError(); if (ErrorCode == ERROR_FILE_NOT_FOUND) { OutputDebugString("ErrorCode == ERROR_FILE_NOT_FOUND----------------------"); } if (ErrorCode == ERROR_ACCESS_DENIED) { //共享内存拒绝访问错误! OutputDebugString("ErrorCode == ERROR_ACCESS_DENIED----------------------"); } return false; // Windows 98下,找不到共享内存,返回值是 ERROR_FILE_NOT_FOUND /*if (IsWin9X()) { if( ErrorCode == ERROR_INVALID_NAME) { return false; } }*/ } m_ShareMemMapHandle = _ShareMemMapHandle; LPVOID ShareMemAddr = MapViewOfFile(m_ShareMemMapHandle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0); if( ShareMemAddr== NULL) { //映射共享内存错误 OutputDebugString("MapViewOfFile ShareMemAddr is null!----------------------"); return false; } m_ShareMemAddr = ShareMemAddr; return true; } //CloseShareMem函数关闭共享内存 bool CShareMem::CloseShareMemMap() { if(m_ShareMemAddr != NULL) { if(!UnmapViewOfFile(m_ShareMemAddr)) return false; m_ShareMemAddr = NULL; } if(m_ShareMemMapHandle != NULL) { if(! CloseHandle(m_ShareMemMapHandle)) return false; m_ShareMemMapHandle = NULL; } return true; } bool CShareMem::ReadShareMem(LPVOID Data,LONG DataSize) { if ( !OpenShareMemMap()) return false; memcpy((LPVOID)Data,m_ShareMemAddr,DataSize); return true; } bool CShareMem::ReadShareMemEx(LONG Positon,LPVOID Data,LONG DataSize) { if ( !OpenShareMemMap()) return false; memcpy((LPVOID)Data,(LPCSTR)m_ShareMemAddr+Positon,DataSize); return true; } bool CShareMem::WriteShareMem(LPVOID Data,LONG DataSize) { if ( !OpenShareMemMap()) return false; memcpy(m_ShareMemAddr,(LPVOID)Data,DataSize); return true; } bool CShareMem::WriteShareMemEx(LONG Positon,LPVOID Data,LONG DataSize) { if ( !OpenShareMemMap()) return false; char temp[512] = { 0 }; sprintf(temp,"WriteShareMemEx Positon:%d,DataSize:%d----------------------", Positon, DataSize); OutputDebugString(temp); memcpy((LPVOID)((LPSTR)m_ShareMemAddr+Positon),(LPVOID)Data,DataSize); return true; }