CShareMemManager.cpp 4.7 KB

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