123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- // libsharememory.cpp : 定义 DLL 应用程序的导出函数。
- //
- #include "stdafx.h"
- #include "libsharememory.h"
- #include <stdio.h>
- class libsharememory_impl
- {
- protected:
- DWORD m_dwBytes;
- HANDLE m_hFileMap;
- BOOL m_bLocked;
- LPVOID m_pData;
- //HANDLE m_hFile;
- HANDLE m_hMutex;
- //int m_nEntityNum;
- public:
- libsharememory_impl()
- {
- //m_hFile=INVALID_HANDLE_VALUE;
- m_hMutex=NULL;
- m_pData=NULL;
- m_hFileMap=NULL;
- m_dwBytes=0;
- //m_nEntityNum = 0;
- }
- ~libsharememory_impl()
- {
- CloseShareMem();
- }
- //创建共享内存区
- BOOL CreateShareMem(LPCTSTR szName, DWORD dwBytes)
- {
- BOOL T=FALSE;
- char szBuf[MAX_PATH];
- LPCTSTR szFile;
- if(szName!=NULL&&dwBytes>0)
- {
- CloseShareMem();
- szFile=tmpnam(szBuf);
- if(szFile!=NULL)
- {
- m_hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwBytes+sizeof(DWORD)+sizeof(int), szName);
- if(m_hFileMap!=NULL)
- {
- m_dwBytes=dwBytes;
- m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- if(m_pData!=NULL)
- {
- *((LPDWORD)m_pData)=dwBytes;
- //*((int*)((LPDWORD)m_pData+1))= ++m_nEntityNum;
- sprintf_s(szBuf, "Mutex<%s>", szName);
- m_hMutex=CreateMutex(NULL, FALSE, szBuf);
- if(m_hMutex!=NULL)
- {
- if(GetLastError()!=ERROR_ALREADY_EXISTS)
- {
- T=TRUE;
- }
- }
- }
- }
- if(!T)
- {
- CloseShareMem();
- }
- }
- }
- return T;
- }
- //打开已有的共享内存区
- BOOL OpenShareMem(LPCTSTR szName)
- {
- BOOL T=FALSE;
- char szBuf[MAX_PATH];
- if(szName!=NULL)
- {
- CloseShareMem();
- m_hFileMap=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
- if(m_hFileMap!=NULL)
- {
- sprintf_s(szBuf, "Mutex<%s>", szName);
- m_hMutex=OpenMutex(MUTEX_ALL_ACCESS, FALSE, szBuf);
- if(m_hMutex!=NULL)
- {
- m_pData=MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- if(LockShareMem())
- {
- m_dwBytes=*((LPDWORD)m_pData);
- //m_nEntityNum = *((int*)((LPDWORD)m_pData+1));
- //*((int*)((LPDWORD)m_pData+1)) = ++m_nEntityNum;
- UnlockShareMem();
- if(m_dwBytes>0)
- {
- T=TRUE;
- }
- }
- }
- }
- if(!T)
- {
- CloseShareMem();
- }
- }
- return T;
- }
- //释放共享内存区
- VOID CloseShareMem()
- {
- if(m_bLocked)
- {
- UnlockShareMem();
- }
- if(m_pData!=NULL)
- {
- UnmapViewOfFile(m_pData);
- m_pData=NULL;
- }
- if(m_hFileMap!=NULL)
- {
- CloseHandle(m_hFileMap);
- m_hFileMap=NULL;
- }
-
- if(m_hMutex!=NULL)
- {
- CloseHandle(m_hMutex);
- m_hMutex=NULL;
- }
- m_dwBytes=0;
- }
- //获取共享内存区大小
- DWORD GetShareMemBytes()
- {
- return m_dwBytes;
- }
- //int GetEntityNum()
- //{
- //LPVOID pdata = LockShareMem();
- //m_nEntityNum = *(int*)((LPDWORD)pdata+1);
- //return m_nEntityNum;
- //}
- //void DeleteEntityNum()
- //{
- //m_nEntityNum--;
- //}
- //是否有可用的内存区
- BOOL IsShareMemValid()
- {
- return (m_hFileMap!=NULL&&m_hMutex!=NULL);
- }
- //锁定访问内存区
- LPVOID LockShareMem(DWORD dwWaitTimeout=INFINITE)
- {
- LPVOID pData=NULL;
- if(IsShareMemValid()&&m_pData!=NULL&&!m_bLocked)
- {
- if(WaitForSingleObject(m_hMutex, dwWaitTimeout)!=WAIT_TIMEOUT)
- {
- m_bLocked=TRUE;
- }
- if(m_bLocked)
- {
- pData=(LPVOID)((LPDWORD)m_pData+1);
- }
- }
- return pData;
- }
- //内存区是否互斥锁定
- BOOL IsShareMemLocked()
- {
- return m_bLocked;
- }
- //解锁内存区
- VOID UnlockShareMem()
- {
- if(m_bLocked)
- {
- ReleaseMutex(m_hMutex);
- m_bLocked=FALSE;
- }
- }
- };
- // 这是已导出类的构造函数。
- // 有关类定义的信息,请参阅 libsharememory.h
- Clibsharememory::Clibsharememory()
- {
- m_pImpl = new libsharememory_impl;
- return;
- }
- Clibsharememory::~Clibsharememory()
- {
- delete m_pImpl;
- }
- VOID Clibsharememory::Unlock()
- {
- m_pImpl->UnlockShareMem();
- return;
- }
- BOOL Clibsharememory::IsLocked()
- {
- BOOL bRst = m_pImpl->IsShareMemLocked();
- return bRst;
- }
- LPVOID Clibsharememory::Lock(DWORD dwWaitTimeout)
- {
- LPVOID lpVoid = m_pImpl->LockShareMem(dwWaitTimeout);
- return lpVoid;
- }
- BOOL Clibsharememory::IsValid()
- {
- BOOL bRst = m_pImpl->IsShareMemValid();
- return bRst;
- }
- DWORD Clibsharememory::GetBytes()
- {
- DWORD TotalBytes = m_pImpl->GetShareMemBytes();
- return TotalBytes;
- }
- VOID Clibsharememory::Close()
- {
- m_pImpl->CloseShareMem();
- return;
- }
- BOOL Clibsharememory::Open(LPCTSTR szName)
- {
- BOOL bRst = m_pImpl->OpenShareMem(szName);
- return bRst;
- }
- BOOL Clibsharememory::Create(LPCTSTR szName, DWORD dwBytes)
- {
- BOOL bRst = m_pImpl->CreateShareMem(szName,dwBytes);
- return bRst;
- }
- int Clibsharememory::GetEntityNum()
- {
- //return m_pImpl->GetEntityNum();
- return 0;
- }
|