#include "stdafx.h" #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; if ((!IsWinNT()) && (!IsWin9X())) return false; if (IsWinNT()) { InitializeSecurityDescriptor(&SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&SecurityDescriptor, true, NULL, false); SecurityAttributes.nLength = sizeof(SecurityAttributes); SecurityAttributes.lpSecurityDescriptor = &SecurityDescriptor; SecurityAttributes.bInheritHandle = true; _ShareMemHandle = CreateFileMapping(NULL, &SecurityAttributes, PAGE_READWRITE, 0, ShareMemLen, m_ShareMemName.c_str()); } if (IsWin9X()) { _ShareMemHandle = CreateFileMapping(NULL, NULL, PAGE_READWRITE, 0, ShareMemLen, m_ShareMemName.c_str()); } m_ShareMemHandle = _ShareMemHandle; m_ShareMemSize = ShareMemLen; if ((_ShareMemHandle != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) { return true; } if (_ShareMemHandle == 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) { DWORD ErrorCode = GetLastError(); if( ErrorCode == ERROR_FILE_NOT_FOUND) return false; if ( IsWin9X() ) // Windows 98下,找不到共享内存,返回值是 ERROR_FILE_NOT_FOUND { if( ErrorCode == ERROR_INVALID_NAME) { return false; } } if( ErrorCode == ERROR_ACCESS_DENIED) { //Application.MessageBox('共享内存拒绝访问错误!','系统错误',MB_OK); return false; } } m_ShareMemMapHandle = _ShareMemMapHandle; LPVOID ShareMemAddr = MapViewOfFile(m_ShareMemMapHandle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0); if( ShareMemAddr== NULL) { //Application.MessageBox('映射共享内存错误!','映射共享内存',MB_OK); 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; memcpy((LPVOID)((LPCSTR)m_ShareMemAddr+Positon),(LPVOID)Data,DataSize); return true; }