/********************************************************************************************
* MOD-NAME : SharedMemory.cpp
* LONG-NAME :
*
* AUTHOR : Martin Ziacek
* DEPARTMENT :
* TELEPHONE :
* CREATION-DATE : 09/05/2001 18:00:00
* SP-NO :
* FUNCTION :
*
*********************************************************************************************/
#include "stdafx.h"
#include "helpers.h"
#include "SharedMemory.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSharedMemory
IMPLEMENT_DYNAMIC(CSharedMemory, CObject)
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : CSharedMemory::SetLastError
* DESCRIPTION :
* RETURN TYPE : void
* ARGUMENT : DWORD dwErrCode
* AUTHOR : Martin Ziacek
* DATE OF LAST UPDATE : 13/11/2001 10:17:44
* GLOBAL READ :
* GLOBAL WRITE :
* FUNCTION CALLS :
* ERROR-EXITS :
* SIDE-EFFECTS :
**************************************************************************************/
void CSharedMemory::SetLastError(DWORD dwErrCode) //this method and following macro will
{ //provide trace output of error description
m_dwLastError = dwErrCode; //with file name and line number where
::SetLastError(dwErrCode); //error occures - it works correctly
} //only in this order
#ifdef _DEBUG
#define SetLastError(err) DumpErrorCode(err,__LINE__,__FILE__); SetLastError(err)
#endif
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : CSharedMemory::CSharedMemory
* DESCRIPTION :
* RETURN TYPE :
* ARGUMENT : const TCHAR *szName
* ARGUMENT : DWORD dwSize
* ARGUMENT : PINITMEMORY InitMemoryProcedure
* ARGUMENT : LPSECURITY_ATTRIBUTES lpsaAttributes
* AUTHOR : Martin Ziacek
* DATE OF LAST UPDATE : 13/11/2001 10:17:49
* GLOBAL READ :
* GLOBAL WRITE :
* FUNCTION CALLS :
* ERROR-EXITS :
* SIDE-EFFECTS :
**************************************************************************************/
CSharedMemory::CSharedMemory(const TCHAR *szName, DWORD dwSize, PINITMEMORY InitMemoryProcedure,LPSECURITY_ATTRIBUTES lpsaAttributes )
: m_dwLastError(0),
m_pNewAcl(NULL),
m_pLogSid(NULL),
m_pSysSid(NULL),
m_pEvrSid(NULL),
m_bCreated(FALSE),
m_bFirst(TRUE),
m_pSync(NULL),
m_pLock(NULL),
m_bSecPres(FALSE)
{
do {
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi)) {
TRACE(_T("osvi.dwMajorVersion = %d\n"),osvi.dwMajorVersion);
TRACE(_T("osvi.dwMinorVersion = %d\n"),osvi.dwMinorVersion);
if (osvi.dwMajorVersion >= 3) {
if ((osvi.dwMinorVersion == 51) ||
(osvi.dwMinorVersion == 0) ||
(osvi.dwMinorVersion == 1)) {
m_bSecPres = TRUE;
}
}
} else {
SetLastError(::GetLastError());
break;
}
//copy or create security descriptor for objects
if (m_bSecPres) {
if (lpsaAttributes) {
if (!SetSa(lpsaAttributes)) {
break;
}
} else {
if (!CreateSa()) {
break;
}
}
}
//create synchronization mechanism
m_pSync = new CSemaphore(1,1,CString(szName)+CString(_T("_Sync")),m_bSecPres ? &m_SecAtr : NULL);
if (!m_pSync) {
break;
}
m_pLock = new CSingleLock(m_pSync);
if (!m_pLock) {
break;
}
m_pLock->Lock(); //lock access
// atempt to create file mapping in th page file ...
m_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE,m_bSecPres ? &m_SecAtr : NULL,PAGE_READWRITE,0,dwSize,szName);
// ... it can already exist (it is not error) ...
if (::GetLastError() == ERROR_ALREADY_EXISTS) {
m_bFirst = FALSE; //remember, we are not first
}
// ... it can fail ...
if (m_hFileMap == NULL) {
SetLastError(::GetLastError());
break;
}
// ... but if it did not, map a view
m_lpView = (LPBYTE) MapViewOfFile(m_hFileMap,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);
if (!m_lpView) {
SetLastError(::GetLastError());
break;
}
//allow usage only of already existing size, could be less then requested
if (m_bFirst) {
::ZeroMemory(m_lpView,dwSize);
m_dwMemSize = dwSize;
CopyMemory(m_lpView+sizeof(DWORD),&m_dwMemSize,sizeof(DWORD));
} else {
CopyMemory(&m_dwMemSize,m_lpView+sizeof(DWORD),sizeof(DWORD));
}
//if everything is OK up to now, the we have shared memory
m_bCreated = TRUE;
m_CsName = szName;
//and it can be initialized in one place
if (InitMemoryProcedure) {
m_pLock->Unlock(); //temporary unlock to allow access from InitMemoryProcedure()
InitMemoryProcedure(this);
m_pLock->Lock();
}
} while (FALSE);
if (m_pLock) m_pLock->Unlock();
}
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : CSharedMemory::~CSharedMemory
* DESCRIPTION :
* RETURN TYPE :
* AUTHOR : Martin Ziacek
* DATE OF LAST UPDATE : 13/11/2001 10:17:55
* GLOBAL READ :
* GLOBAL WRITE :
* FUNCTION CALLS :
* ERROR-EXITS :
* SIDE-EFFECTS :
**************************************************************************************/
CSharedMemory::~CSharedMemory()
{
if (m_lpView) UnmapViewOfFile(m_lpView);
if (m_hFileMap) CloseHandle(m_hFileMap);
if (m_pNewAcl) HeapFree(GetProcessHeap(), 0, m_pNewAcl);
if (m_pLogSid) FreeSid(m_pLogSid);
if (m_pSysSid) FreeSid(m_pSysSid);
if (m_pEvrSid) FreeSid(m_pEvrSid);
if (m_pLock) delete m_pLock;
if (m_pSync) delete m_pSync;
}
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : CSharedMemory::GetMemName
* DESCRIPTION :
* RETURN TYPE : CString
* ARGUMENT : void
* AUTHOR : Martin Ziacek
* DATE OF LAST UPDATE : 13/11/2001 10:17:58
* GLOBAL READ :
* GLOBAL WRITE :
* FUNCTION CALLS :
* ERROR-EXITS :
* SIDE-EFFECTS :
**************************************************************************************/
CString CSharedMemory::GetMemName(void)
{
if (m_bCreated) {
return m_CsName;
} else {
SetLastError(ERROR_OBJECT_NOT_FOUND);
return CString(_T(""));
}
}
#ifdef _DEBUG
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : CSharedMemory::AssertValid
* DESCRIPTION :
* RETURN TYPE : void
* AUTHOR : Martin Ziacek
* DATE OF LAST UPDATE : 13/11/2001 10:18:02
* GLOBAL READ :
* GLOBAL WRITE :
* FUNCTION CALLS :
* ERROR-EXITS :
* SIDE-EFFECTS :
**************************************************************************************/
void CSharedMemory::AssertValid()
{
CObject::AssertValid();
ASSERT(m_bCreated);
ASSERT(m_hFileMap != NULL);
ASSERT(m_hFileMap != INVALID_HANDLE_VALUE);
ASSERT(m_lpView != NULL);
ASSERT(m_pSync != NULL);
ASSERT(m_pLock != NULL);
}
/**************************************************************************************
* PROG-NAME :
* LONG-NAME :
* FUNCTION : C
sm_mz.zip_visual c
版权申诉
62 浏览量
2022-09-23
16:31:13
上传
评论
收藏 10KB ZIP 举报
局外狗
- 粉丝: 67
- 资源: 1万+
最新资源
- 整卷预览.mhtml
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- 基于Javascript的结婚请帖设计源码 - Invitation
- mysql语句大全及用法
- mysql语句大全及用法
- mysql语句大全及用法
- MySQL是一种广泛使用的开源关系型数据库管理系统
- MySQL是一种广泛使用的开源关系型数据库管理系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈