CShareMemManager.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #include "stdafx.h"
  2. #include "CShareMemManager.h"
  3. bool IsWin9X()
  4. {
  5. OSVERSIONINFO SysOSVersionInfo;
  6. SysOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  7. GetVersionEx(&SysOSVersionInfo);
  8. if (SysOSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  9. return true;
  10. else
  11. return false;
  12. }
  13. bool IsWinNT()
  14. {
  15. OSVERSIONINFO SysOSVersionInfo;
  16. SysOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  17. GetVersionEx(&SysOSVersionInfo);
  18. if (SysOSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
  19. return true;
  20. else
  21. return false;
  22. }
  23. //CreatShareMem函数创建共享内存
  24. //参数ShareMemLen为共享内存的大小(字节为单位)
  25. bool CShareMem::CreateShareMem(DWORD ShareMemLen)
  26. {
  27. SECURITY_ATTRIBUTES SecurityAttributes;
  28. SECURITY_DESCRIPTOR SecurityDescriptor;
  29. HANDLE _ShareMemHandle = NULL;
  30. if((!IsWinNT())&&(!IsWin9X()))
  31. return false;
  32. if (IsWinNT())
  33. {
  34. InitializeSecurityDescriptor(&SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);
  35. SetSecurityDescriptorDacl(&SecurityDescriptor,true,NULL,false);
  36. SecurityAttributes.nLength = sizeof(SecurityAttributes);
  37. SecurityAttributes.lpSecurityDescriptor = &SecurityDescriptor;
  38. SecurityAttributes.bInheritHandle = true;
  39. _ShareMemHandle=CreateFileMapping( NULL ,
  40. &SecurityAttributes,
  41. PAGE_READWRITE,
  42. 0,
  43. ShareMemLen,
  44. strShareMemName);
  45. }
  46. if (IsWin9X())
  47. {
  48. _ShareMemHandle=CreateFileMapping( NULL,
  49. NULL,
  50. PAGE_READWRITE,
  51. 0,
  52. ShareMemLen,
  53. strShareMemName);
  54. }
  55. m_ShareMemHandle = _ShareMemHandle;
  56. m_ShareMemSize = ShareMemLen;
  57. if ((_ShareMemHandle != NULL)&&(GetLastError() == ERROR_ALREADY_EXISTS))
  58. {
  59. return true;
  60. }
  61. if (_ShareMemHandle == NULL)
  62. {
  63. return false ;
  64. }
  65. return true;
  66. }
  67. CShareMem::CShareMem(LPCWSTR MemName)
  68. {
  69. m_ShareMemHandle = NULL;
  70. m_ShareMemMapHandle = NULL;
  71. m_ShareMemAddr = NULL;
  72. strShareMemName = MemName;
  73. m_ShareMemSize = 0;
  74. }
  75. CShareMem::~CShareMem()
  76. {
  77. CloseShareMemMap();
  78. if(m_ShareMemHandle == NULL)
  79. return;
  80. if(! CloseHandle(m_ShareMemHandle))
  81. return;
  82. m_ShareMemHandle = NULL;
  83. }
  84. DWORD CShareMem::GetShareMemSize()
  85. {
  86. return m_ShareMemSize;
  87. }
  88. //OpenShareMem函数打开共享内存
  89. bool CShareMem::OpenShareMemMap()
  90. {
  91. if((m_ShareMemMapHandle!= NULL)&&(m_ShareMemAddr != NULL))
  92. return true;
  93. HANDLE _ShareMemMapHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS,
  94. false,
  95. (LPCTSTR)strShareMemName);
  96. if (_ShareMemMapHandle == NULL)
  97. {
  98. DWORD ErrorCode = GetLastError();
  99. if( ErrorCode == ERROR_FILE_NOT_FOUND)
  100. return false;
  101. if ( IsWin9X() )
  102. // Windows 98下,找不到共享内存,返回值是 ERROR_FILE_NOT_FOUND
  103. {
  104. if( ErrorCode == ERROR_INVALID_NAME)
  105. {
  106. return false;
  107. }
  108. }
  109. if( ErrorCode == ERROR_ACCESS_DENIED)
  110. {
  111. //Application.MessageBox('共享内存拒绝访问错误!','系统错误',MB_OK);
  112. return false;
  113. }
  114. }
  115. m_ShareMemMapHandle = _ShareMemMapHandle;
  116. LPVOID ShareMemAddr = MapViewOfFile(m_ShareMemMapHandle,
  117. FILE_MAP_READ|FILE_MAP_WRITE,
  118. 0,
  119. 0,
  120. 0);
  121. if( ShareMemAddr== NULL)
  122. {
  123. //Application.MessageBox('映射共享内存错误!','映射共享内存',MB_OK);
  124. return false;
  125. }
  126. m_ShareMemAddr = ShareMemAddr;
  127. return true;
  128. }
  129. //CloseShareMem函数关闭共享内存
  130. bool CShareMem::CloseShareMemMap()
  131. {
  132. if(m_ShareMemAddr != NULL)
  133. {
  134. if(!UnmapViewOfFile(m_ShareMemAddr))
  135. return false;
  136. m_ShareMemAddr = NULL;
  137. }
  138. if(m_ShareMemMapHandle != NULL)
  139. {
  140. if(! CloseHandle(m_ShareMemMapHandle))
  141. return false;
  142. m_ShareMemMapHandle = NULL;
  143. }
  144. return true;
  145. }
  146. bool CShareMem::ReadShareMem(LPVOID Data,LONG DataSize)
  147. {
  148. if ( !OpenShareMemMap())
  149. return false;
  150. memcpy((LPVOID)Data,m_ShareMemAddr,DataSize);
  151. return true;
  152. }
  153. bool CShareMem::ReadShareMemEx(LONG Positon,LPVOID Data,LONG DataSize)
  154. {
  155. if ( !OpenShareMemMap())
  156. return false;
  157. memcpy((LPVOID)Data,(LPCSTR)m_ShareMemAddr+Positon,DataSize);
  158. return true;
  159. }
  160. bool CShareMem::WriteShareMem(LPVOID Data,LONG DataSize)
  161. {
  162. if ( !OpenShareMemMap())
  163. return false;
  164. memcpy(m_ShareMemAddr,(LPVOID)Data,DataSize);
  165. return true;
  166. }
  167. bool CShareMem::WriteShareMemEx(LONG Positon,LPVOID Data,LONG DataSize)
  168. {
  169. if ( !OpenShareMemMap())
  170. return false;
  171. memcpy((LPVOID)((LPCSTR)m_ShareMemAddr+Positon),(LPVOID)Data,DataSize);
  172. return true;
  173. }