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


// ClientData.cpp: implementation of the CClientData class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "WFClient.h" 
#include "ClientData.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
void CClientData::_Init() 
{ 
	m_hMapFile=NULL; 
    m_pBaseMapFile=NULL; 
	m_iOpenFlag = 0; 
	m_nSumOfRealData=0; 
} 
 
CClientData::CClientData() 
{ 
	_Init(); 
} 
 
/************************************************************ 
函数功能描述: 
释放映射缓存区视图,关闭映射文件的句柄 
************************************************************/ 
void CClientData::_Destory() 
{ 
	if(m_pBaseMapFile) 
	{ 
		UnmapViewOfFile(m_pBaseMapFile); 
		m_pBaseMapFile=NULL; 
	} 
 
	if(m_hMapFile) 
	{ 
		CloseHandle(m_hMapFile); 
		m_hMapFile=NULL; 
	} 
} 
 
CClientData::~CClientData() 
{ 
	_Destory(); 
} 
 
/************************************************************ 
函数功能描述: 
获得共享内存对象,建立映射缓存区视图 
************************************************************/ 
int CClientData::Open(DWORD dwAccess, char *szMapName) 
{ 
	if (m_iOpenFlag) 
		_Destory(); 
 
	m_hMapFile = OpenFileMapping( 
		dwAccess, 
		TRUE, 
		szMapName); 
 
	if (m_hMapFile) 
	{ 
		m_pBaseMapFile = MapViewOfFile( 
			m_hMapFile, 
			dwAccess, 
			0, 
			0, 
			0); 
 
		m_iOpenFlag = 1; 
		return 1; 
	} 
    else 
	    return -1; 
 
} 
 
/************************************************************ 
函数功能描述: 
设置实际数据点个数(与服务器端要一致),并初始化共享内存区各数据区指针 
************************************************************/ 
void CClientData::SetRealDataSum(int nSumOfRealData) 
{ 
	m_nSumOfRealData=nSumOfRealData; 
 
	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; 
    } 
} 
 
/************************************************************ 
函数功能描述: 
得到数据区2的子值,nIndex的初值为0  
************************************************************/ 
int CClientData::GetData2Value(int nIndex) 
{ 
	if (m_pBaseMapFile && (nIndex < m_nSumOfRealData)&&(nIndex >-1)) 
    {         
		int *pData = m_pData2 + nIndex; 
		return *pData; 
	} 
    return -1; 
} 
 
/************************************************************ 
函数功能描述: 
设置数据区1的子值,nIndex的初值为0  
************************************************************/ 
int CClientData::SetData1Value(int nIndex,int Value) 
{ 
	if (m_pBaseMapFile && (nIndex < m_nSumOfRealData)&&(nIndex >-1)) 
    {         
		int *pData = m_pData1 + nIndex; 
        *pData=Value; 
		return 0; 
    } 
    return -1; 
} 
 
/************************************************************ 
函数功能描述: 
得到服务端窗口句柄 
************************************************************/ 
void CClientData::GetServerAddress(HWND& addr) 
{ 
	if(m_pBaseMapFile) 
		memcpy((char*)&addr,(char *)m_pWndHandle,sizeof(HWND)); 
    else  
        addr=0; 
} 
 
/************************************************************ 
函数功能描述: 
设置客户端窗口句柄 
************************************************************/ 
void CClientData::SetClientAddress(HWND addr) 
{ 
	if(m_pBaseMapFile) 
		memcpy((char*)m_pWndHandle+4, (char*)&addr,sizeof(HWND)); 
}