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