123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #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;
- }
|