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));
}