⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memfilemap.cpp

📁 《EVC高级编程及其应用开发》第六章代码
💻 CPP
字号:
// MemFileMap.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "MemFileMap.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMemFileMap

/*
*构造函数,初始化类成员变量
*/
CMemFileMap::CMemFileMap()
{
  m_pMapPointer = NULL;
  m_hMapFile = NULL;
  m_hSynEvent = NULL ; 
  m_SynMessageID = -1;
  m_pParentWnd = NULL;
  m_Syn =false;
}

CMemFileMap::~CMemFileMap()
{
}


BEGIN_MESSAGE_MAP(CMemFileMap, CWnd)
	//{{AFX_MSG_MAP(CMemFileMap)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMemFileMap message handlers

/*
*函数介绍:创建或打开内存映射文件
*入口参数:(无)
*出口参数:(无)
*返回值:<=0 ,代表失败
*        >0,代表成功
*       -1 : 代表创建失败
*       -2 : 代表映射失败
*       -3 : 创建同步事件失败
*       -4 : 注册消息失败
*        1 : 代表创建成功,并且是新创建
*        2 : 代表打开成功,文件已存在
*/
DWORD CMemFileMap::OpenFileMap(CWnd * pWnd)
{
	DWORD returnValue = 1; //定义返回变量

    m_pParentWnd = pWnd;
    //创建内存映射文件
	m_hMapFile =CreateFileMapping(HANDLE(0xFFFFFFFF), NULL, 
		PAGE_READWRITE, 0,m_MaxSize,m_MapName.GetBuffer(m_MapName.GetLength()));  
	
	if ((m_hMapFile == INVALID_HANDLE_VALUE) || (m_hMapFile == 0))
	{
		return -1; //代表创建失败
	}

	if ((m_hMapFile != 0) && (GetLastError() == ERROR_ALREADY_EXISTS))
	{
		//内存文件,已创建
		returnValue = 2; //代表内存文件已打开
	}

	m_pMapPointer = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    if (m_pMapPointer == NULL)
	{
		CloseHandle(m_hMapFile);
	    m_hMapFile = NULL;
        return -2;//'映射文件的视图到进程的地址空间失败')
	}

	m_hSynEvent = CreateEvent(NULL,FALSE,TRUE,_T("MEMFILE"));
	if (!m_hSynEvent)
	{
       UnmapViewOfFile(m_pMapPointer);
       m_pMapPointer = NULL;
	   CloseHandle(m_hMapFile);
	   m_hMapFile = NULL;
	   return -3;//创建同步事件失败
	}

	m_SynMessageID = RegisterWindowMessage(MEMFILECHANG);
	 if (!m_SynMessageID)
	 {
       UnmapViewOfFile(m_pMapPointer);
       m_pMapPointer = NULL;
	   CloseHandle(m_hMapFile);
	   m_hMapFile = NULL;
	   CloseHandle(m_hSynEvent);
	   m_hSynEvent = NULL;
	   return -4 ; //注册消息失败
	 }
  return returnValue;
}

/*
*函数介绍:关闭内存映射文件
*入口参数:(无)
*出口参数:(无)
*返回值:(无)
*/
void CMemFileMap::CloseFileMap()
{
	if (m_pMapPointer)
	{
	  UnmapViewOfFile(m_pMapPointer);
      m_pMapPointer = NULL;
	}

	if (m_hMapFile)
	{
		CloseHandle(m_hMapFile);
		m_hMapFile = NULL;
	}

	if (m_hSynEvent)
	{
	   CloseHandle(m_hSynEvent);
	   m_hSynEvent = NULL;
	}
}


/*
*函数介绍:读取内存映射文件内容
*入口参数:(无)
*出口参数:(无)
*返回值:内存文件内容指针
*/
LPCTSTR CMemFileMap::ReadBuffer()
{
  return m_pMapPointer;
}

/*
*函数介绍:写入内存映射文件内容
*入口参数:buf :要写入的字符串数据指针
*出口参数:(无)
*返回值:-1 :失败;1:成功
*/
DWORD CMemFileMap::WriteBuffer(LPCTSTR buf)
{
  if ((lstrlen(buf)) > m_MaxSize)
  {
	  return -1; //写入缓冲区,大于定义大小
  }
  //同步写过程,等待同步信号,且等到同步信号,自动关闭信号
  if (WaitForSingleObject(m_hSynEvent,INFINITE) == WAIT_OBJECT_0)
  {
    lstrcpy(m_pMapPointer,buf);
  }
 
  ::SendMessage(HWND_BROADCAST,m_SynMessageID,WPARAM(m_hWnd),0);
  //使同步事件有信号
  SetEvent(m_hSynEvent);
  return 1;
}



LRESULT CMemFileMap::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if (message == m_SynMessageID)
	{
		//如果同步的话
		if (m_Syn)
		{
		  m_OnMemDataChange(m_pParentWnd);
		}
	}
	return CWnd::WindowProc(message, wParam, lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -