CShareMemManager.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. CShareMem::CShareMem(std::string MemName)
  24. {
  25. m_ShareMemHandle = NULL;
  26. m_ShareMemMapHandle = NULL;
  27. m_ShareMemAddr = NULL;
  28. m_ShareMemName = MemName;
  29. m_ShareMemSize = 0;
  30. }
  31. CShareMem::~CShareMem()
  32. {
  33. CloseShareMemMap();
  34. if(m_ShareMemHandle == NULL)
  35. return;
  36. if(! CloseHandle(m_ShareMemHandle))
  37. return;
  38. m_ShareMemHandle = NULL;
  39. }
  40. //CreatShareMem函数创建共享内存
  41. //参数ShareMemLen为共享内存的大小(字节为单位)
  42. bool CShareMem::CreateShareMem(DWORD ShareMemLen)
  43. {
  44. SECURITY_ATTRIBUTES SecurityAttributes;
  45. SECURITY_DESCRIPTOR SecurityDescriptor;
  46. HANDLE _ShareMemHandle = NULL;
  47. if ((!IsWinNT()) && (!IsWin9X()))
  48. return false;
  49. if (IsWinNT())
  50. {
  51. InitializeSecurityDescriptor(&SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
  52. SetSecurityDescriptorDacl(&SecurityDescriptor, true, NULL, false);
  53. SecurityAttributes.nLength = sizeof(SecurityAttributes);
  54. SecurityAttributes.lpSecurityDescriptor = &SecurityDescriptor;
  55. SecurityAttributes.bInheritHandle = true;
  56. _ShareMemHandle = CreateFileMapping(NULL,
  57. &SecurityAttributes,
  58. PAGE_READWRITE,
  59. 0,
  60. ShareMemLen,
  61. m_ShareMemName.c_str());
  62. }
  63. if (IsWin9X())
  64. {
  65. _ShareMemHandle = CreateFileMapping(NULL,
  66. NULL,
  67. PAGE_READWRITE,
  68. 0,
  69. ShareMemLen,
  70. m_ShareMemName.c_str());
  71. }
  72. m_ShareMemHandle = _ShareMemHandle;
  73. m_ShareMemSize = ShareMemLen;
  74. if ((_ShareMemHandle != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS))
  75. {
  76. return true;
  77. }
  78. if (_ShareMemHandle == NULL)
  79. {
  80. return false;
  81. }
  82. return true;
  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,false,m_ShareMemName.c_str());
  94. if (_ShareMemMapHandle == NULL)
  95. {
  96. DWORD ErrorCode = GetLastError();
  97. if( ErrorCode == ERROR_FILE_NOT_FOUND)
  98. return false;
  99. if ( IsWin9X() )
  100. // Windows 98下,找不到共享内存,返回值是 ERROR_FILE_NOT_FOUND
  101. {
  102. if( ErrorCode == ERROR_INVALID_NAME)
  103. {
  104. return false;
  105. }
  106. }
  107. if( ErrorCode == ERROR_ACCESS_DENIED)
  108. {
  109. //Application.MessageBox('共享内存拒绝访问错误!','系统错误',MB_OK);
  110. return false;
  111. }
  112. }
  113. m_ShareMemMapHandle = _ShareMemMapHandle;
  114. LPVOID ShareMemAddr = MapViewOfFile(m_ShareMemMapHandle,
  115. FILE_MAP_READ|FILE_MAP_WRITE,
  116. 0,
  117. 0,
  118. 0);
  119. if( ShareMemAddr== NULL)
  120. {
  121. //Application.MessageBox('映射共享内存错误!','映射共享内存',MB_OK);
  122. return false;
  123. }
  124. m_ShareMemAddr = ShareMemAddr;
  125. return true;
  126. }
  127. //CloseShareMem函数关闭共享内存
  128. bool CShareMem::CloseShareMemMap()
  129. {
  130. if(m_ShareMemAddr != NULL)
  131. {
  132. if(!UnmapViewOfFile(m_ShareMemAddr))
  133. return false;
  134. m_ShareMemAddr = NULL;
  135. }
  136. if(m_ShareMemMapHandle != NULL)
  137. {
  138. if(! CloseHandle(m_ShareMemMapHandle))
  139. return false;
  140. m_ShareMemMapHandle = NULL;
  141. }
  142. return true;
  143. }
  144. bool CShareMem::ReadShareMem(LPVOID Data,LONG DataSize)
  145. {
  146. if ( !OpenShareMemMap())
  147. return false;
  148. memcpy((LPVOID)Data,m_ShareMemAddr,DataSize);
  149. return true;
  150. }
  151. bool CShareMem::ReadShareMemEx(LONG Positon,LPVOID Data,LONG DataSize)
  152. {
  153. if ( !OpenShareMemMap())
  154. return false;
  155. memcpy((LPVOID)Data,(LPCSTR)m_ShareMemAddr+Positon,DataSize);
  156. return true;
  157. }
  158. bool CShareMem::WriteShareMem(LPVOID Data,LONG DataSize)
  159. {
  160. if ( !OpenShareMemMap())
  161. return false;
  162. memcpy(m_ShareMemAddr,(LPVOID)Data,DataSize);
  163. return true;
  164. }
  165. bool CShareMem::WriteShareMemEx(LONG Positon,LPVOID Data,LONG DataSize)
  166. {
  167. if ( !OpenShareMemMap())
  168. return false;
  169. memcpy((LPVOID)((LPCSTR)m_ShareMemAddr+Positon),(LPVOID)Data,DataSize);
  170. return true;
  171. }