#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; } //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, strShareMemName); } if (IsWin9X()) { _ShareMemHandle=CreateFileMapping( NULL, NULL, PAGE_READWRITE, 0, ShareMemLen, strShareMemName); } m_ShareMemHandle = _ShareMemHandle; m_ShareMemSize = ShareMemLen; if ((_ShareMemHandle != NULL)&&(GetLastError() == ERROR_ALREADY_EXISTS)) { return true; } if (_ShareMemHandle == NULL) { return false ; } return true; } CShareMem::CShareMem(LPCWSTR MemName) { m_ShareMemHandle = NULL; m_ShareMemMapHandle = NULL; m_ShareMemAddr = NULL; strShareMemName = MemName; m_ShareMemSize = 0; } CShareMem::~CShareMem() { CloseShareMemMap(); if(m_ShareMemHandle == NULL) return; if(! CloseHandle(m_ShareMemHandle)) return; m_ShareMemHandle = NULL; } 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, (LPCTSTR)strShareMemName); 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; }