libsharememory.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // libsharememory.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "libsharememory.h"
  5. #include <stdio.h>
  6. class libsharememory_impl
  7. {
  8. protected:
  9. DWORD m_dwBytes;
  10. HANDLE m_hFileMap;
  11. BOOL m_bLocked;
  12. LPVOID m_pData;
  13. //HANDLE m_hFile;
  14. HANDLE m_hMutex;
  15. //int m_nEntityNum;
  16. public:
  17. libsharememory_impl()
  18. {
  19. //m_hFile=INVALID_HANDLE_VALUE;
  20. m_hMutex=NULL;
  21. m_pData=NULL;
  22. m_hFileMap=NULL;
  23. m_dwBytes=0;
  24. //m_nEntityNum = 0;
  25. }
  26. ~libsharememory_impl()
  27. {
  28. CloseShareMem();
  29. }
  30. //创建共享内存区
  31. BOOL CreateShareMem(LPCTSTR szName, DWORD dwBytes)
  32. {
  33. BOOL T=FALSE;
  34. char szBuf[MAX_PATH];
  35. LPCTSTR szFile;
  36. if(szName!=NULL&&dwBytes>0)
  37. {
  38. CloseShareMem();
  39. szFile=tmpnam(szBuf);
  40. if(szFile!=NULL)
  41. {
  42. m_hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwBytes+sizeof(DWORD)+sizeof(int), szName);
  43. if(m_hFileMap!=NULL)
  44. {
  45. m_dwBytes=dwBytes;
  46. m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  47. if(m_pData!=NULL)
  48. {
  49. *((LPDWORD)m_pData)=dwBytes;
  50. //*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
  51. sprintf_s(szBuf, "Mutex<%s>", szName);
  52. m_hMutex=CreateMutex(NULL, FALSE, szBuf);
  53. if(m_hMutex!=NULL)
  54. {
  55. if(GetLastError()!=ERROR_ALREADY_EXISTS)
  56. {
  57. T=TRUE;
  58. }
  59. }
  60. }
  61. }
  62. if(!T)
  63. {
  64. CloseShareMem();
  65. }
  66. }
  67. }
  68. return T;
  69. }
  70. //打开已有的共享内存区
  71. BOOL OpenShareMem(LPCTSTR szName)
  72. {
  73. BOOL T=FALSE;
  74. char szBuf[MAX_PATH];
  75. if(szName!=NULL)
  76. {
  77. CloseShareMem();
  78. m_hFileMap=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
  79. if(m_hFileMap!=NULL)
  80. {
  81. sprintf_s(szBuf, "Mutex<%s>", szName);
  82. m_hMutex=OpenMutex(MUTEX_ALL_ACCESS, FALSE, szBuf);
  83. if(m_hMutex!=NULL)
  84. {
  85. m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  86. if(LockShareMem())
  87. {
  88. m_dwBytes=*((LPDWORD)m_pData);
  89. //m_nEntityNum = *((int*)((LPDWORD)m_pData+1));
  90. //*((int*)((LPDWORD)m_pData+1)) = ++m_nEntityNum;
  91. UnlockShareMem();
  92. if(m_dwBytes>0)
  93. {
  94. T=TRUE;
  95. }
  96. }
  97. }
  98. }
  99. if(!T)
  100. {
  101. CloseShareMem();
  102. }
  103. }
  104. return T;
  105. }
  106. //释放共享内存区
  107. VOID CloseShareMem()
  108. {
  109. if(m_bLocked)
  110. {
  111. UnlockShareMem();
  112. }
  113. if(m_pData!=NULL)
  114. {
  115. UnmapViewOfFile(m_pData);
  116. m_pData=NULL;
  117. }
  118. if(m_hFileMap!=NULL)
  119. {
  120. CloseHandle(m_hFileMap);
  121. m_hFileMap=NULL;
  122. }
  123. if(m_hMutex!=NULL)
  124. {
  125. CloseHandle(m_hMutex);
  126. m_hMutex=NULL;
  127. }
  128. m_dwBytes=0;
  129. }
  130. //获取共享内存区大小
  131. DWORD GetShareMemBytes()
  132. {
  133. return m_dwBytes;
  134. }
  135. //int GetEntityNum()
  136. //{
  137. //LPVOID pdata = LockShareMem();
  138. //m_nEntityNum = *(int*)((LPDWORD)pdata+1);
  139. //return m_nEntityNum;
  140. //}
  141. //void DeleteEntityNum()
  142. //{
  143. //m_nEntityNum--;
  144. //}
  145. //是否有可用的内存区
  146. BOOL IsShareMemValid()
  147. {
  148. return (m_hFileMap!=NULL&&m_hMutex!=NULL);
  149. }
  150. //锁定访问内存区
  151. LPVOID LockShareMem(DWORD dwWaitTimeout=INFINITE)
  152. {
  153. LPVOID pData=NULL;
  154. if(IsShareMemValid()&&m_pData!=NULL&&!m_bLocked)
  155. {
  156. if(WaitForSingleObject(m_hMutex, dwWaitTimeout)!=WAIT_TIMEOUT)
  157. {
  158. m_bLocked=TRUE;
  159. }
  160. if(m_bLocked)
  161. {
  162. pData=(LPVOID)((LPDWORD)m_pData+1);
  163. }
  164. }
  165. return pData;
  166. }
  167. //内存区是否互斥锁定
  168. BOOL IsShareMemLocked()
  169. {
  170. return m_bLocked;
  171. }
  172. //解锁内存区
  173. VOID UnlockShareMem()
  174. {
  175. if(m_bLocked)
  176. {
  177. ReleaseMutex(m_hMutex);
  178. m_bLocked=FALSE;
  179. }
  180. }
  181. };
  182. // 这是已导出类的构造函数。
  183. // 有关类定义的信息,请参阅 libsharememory.h
  184. Clibsharememory::Clibsharememory()
  185. {
  186. m_pImpl = new libsharememory_impl;
  187. return;
  188. }
  189. Clibsharememory::~Clibsharememory()
  190. {
  191. delete m_pImpl;
  192. }
  193. VOID Clibsharememory::Unlock()
  194. {
  195. m_pImpl->UnlockShareMem();
  196. return;
  197. }
  198. BOOL Clibsharememory::IsLocked()
  199. {
  200. BOOL bRst = m_pImpl->IsShareMemLocked();
  201. return bRst;
  202. }
  203. LPVOID Clibsharememory::Lock(DWORD dwWaitTimeout)
  204. {
  205. LPVOID lpVoid = m_pImpl->LockShareMem(dwWaitTimeout);
  206. return lpVoid;
  207. }
  208. BOOL Clibsharememory::IsValid()
  209. {
  210. BOOL bRst = m_pImpl->IsShareMemValid();
  211. return bRst;
  212. }
  213. DWORD Clibsharememory::GetBytes()
  214. {
  215. DWORD TotalBytes = m_pImpl->GetShareMemBytes();
  216. return TotalBytes;
  217. }
  218. VOID Clibsharememory::Close()
  219. {
  220. m_pImpl->CloseShareMem();
  221. return;
  222. }
  223. BOOL Clibsharememory::Open(LPCTSTR szName)
  224. {
  225. BOOL bRst = m_pImpl->OpenShareMem(szName);
  226. return bRst;
  227. }
  228. BOOL Clibsharememory::Create(LPCTSTR szName, DWORD dwBytes)
  229. {
  230. BOOL bRst = m_pImpl->CreateShareMem(szName,dwBytes);
  231. return bRst;
  232. }
  233. int Clibsharememory::GetEntityNum()
  234. {
  235. //return m_pImpl->GetEntityNum();
  236. return 0;
  237. }