www.pudn.com > 在VC++ 6.0下利用共享内存、消息实现内部进程通讯.rar > ServerData.cpp


// ServerData.cpp: implementation of the CServerData class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "WFServer.h" 
#include "ServerData.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
void CServerData::_Init() 
{ 
	m_hMapFile=NULL; 
    m_pBaseMapFile=NULL; 
} 
 
/************************************************************ 
函数功能描述: 
释放映射缓存区视图,关闭映射文件的句柄 
************************************************************/ 
 
void CServerData::_Destory() 
{ 
	if(m_pBaseMapFile) 
	{ 
		UnmapViewOfFile(m_pBaseMapFile); 
		m_pBaseMapFile=NULL; 
	} 
 
	if(m_hMapFile) 
	{ 
		CloseHandle(m_hMapFile); 
		m_hMapFile=NULL; 
	} 
} 
 
 
CServerData::~CServerData() 
{ 
	_Destory(); 
} 
 
/************************************************************ 
函数功能描述: 
创建一个名为"zzj"的长度为8*(nSumOfRealData+2)字节的共享内存区, 
建立映射缓存区视图,并初始化共享内存区各数据区指针 
************************************************************/ 
 
void CServerData::Create(int nSumOfRealData) 
{ 
	m_hMapFile=CreateFileMapping( 
				(HANDLE)0xffffffff, 
                 NULL, 
				 PAGE_READWRITE, 
                 0, 
                 2*(nSumOfRealData+2)*sizeof(int), 
		         "zzj"); 
 
    if (m_hMapFile) 
    { 
	    m_pBaseMapFile = MapViewOfFile( 
				m_hMapFile, 
				FILE_MAP_READ|FILE_MAP_WRITE, 
				0, 
				0, 
				0); 
	    if (m_pBaseMapFile) 
		{ 
			int* pSum = (int *)m_pBaseMapFile; 
			m_nSumOfRealData = nSumOfRealData; 
 
			*pSum++ = m_nSumOfRealData + 1; 
			m_pData1 = pSum; 
			pSum = m_pData1 + m_nSumOfRealData; 
 
			*pSum++ = m_nSumOfRealData; 
			m_pData2= pSum; 
			pSum = m_pData2 + m_nSumOfRealData; 
 
			m_pWndHandle = pSum; 
		} 
	} 
	else 
	{ 
		m_pBaseMapFile=NULL; 
		m_nSumOfRealData=0; 
	} 
} 
 
CServerData::CServerData() 
{ 
	_Init(); 
} 
 
/************************************************************ 
函数功能描述: 
得到实际数据点个数 
************************************************************/ 
int CServerData::GetRealDataSum() 
{ 
	return m_nSumOfRealData; 
} 
 
/************************************************************ 
函数功能描述: 
设置数据区2的子值,nIndex初值为0 
************************************************************/ 
int CServerData::SetData2Value(int nIndex, int Value) 
{ 
	if (m_pBaseMapFile && (nIndex < m_nSumOfRealData)&&(nIndex >-1)) 
    {         
		int *pData = m_pData2 + nIndex; 
		*pData = Value; 
		return 0; 
    } 
    return -1; 
} 
 
 
/************************************************************ 
函数功能描述: 
得到数据区1的子值,nIndex初值为0 
************************************************************/ 
int CServerData::GetData1Value(int nIndex) 
{ 
	if (m_pBaseMapFile && (nIndex < m_nSumOfRealData)&&(nIndex >-1)) 
    {         
		int *pData = m_pData1 + nIndex; 
        return *pData; 
    } 
    return -1; 
} 
 
/************************************************************ 
函数功能描述: 
设置服务器窗口句柄 
************************************************************/ 
void CServerData::SetServerAddress(HWND addr) 
{ 
	if(m_pBaseMapFile) 
		memcpy((char*)m_pWndHandle, (char*)&addr,sizeof(HWND)); 
} 
 
/************************************************************ 
函数功能描述: 
得到客户端窗口句柄 
************************************************************/ 
void CServerData::GetClientAddress(HWND& addr) 
{ 
	if(m_pBaseMapFile) 
		memcpy((char*)&addr,(char *)m_pWndHandle+4,sizeof(HWND)); 
    else  
        addr=0; 
}