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

📄 canbusinterface.cpp

📁 本源码实现在WinCE系统下
💻 CPP
字号:
// CanBusInterface.cpp : implementation file
//

#include "stdafx.h"
#include "CanBusInterface.h"

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

/////////////////////////////////////////////////////////////////////////////
// CCanBusInterface
/*
*构造函数,初始化类成员变量
*/
CCanBusInterface::CCanBusInterface()
{
	m_pMapPointer = NULL;
	m_hMapFile = NULL;
	m_hSynEvent = NULL ; 
	m_SynMessageID = -1;
	m_pParentWnd = NULL;//父窗口指针
	m_Syn = CAN_MEM_IS_SYNC;//是否自动发送消息
	m_MapName = CAN_MEM_NAME;//共享内存文件名
	m_MaxSize = CAN_MEM_MAX_SIZE;//共享内存字节数
}

CCanBusInterface::~CCanBusInterface()
{
}


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


/////////////////////////////////////////////////////////////////////////////
// CCanBusInterface message handlers

/*
*函数介绍:创建或打开内存映射文件
*入口参数:(无)
*出口参数:(无)
*返回值:<=0 ,代表失败
*        >0,代表成功
*       -1 : 代表创建失败
*       -2 : 代表映射失败
*       -3 : 创建同步事件失败
*       -4 : 注册消息失败
*        1 : 代表创建成功,并且是新创建
*        2 : 代表打开成功,文件已存在
*/
DWORD CCanBusInterface::OpenFileMap(LPVOID 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, m_MaxSize);
    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 ; //注册消息失败
	 }

	 char * temp;
	 temp = (char*)m_pMapPointer;
	 for(int i=0;i<240;i++)
	 {
		 *(temp+i) = 0x00;
	 }
  return returnValue;
}

/*
*函数介绍:关闭内存映射文件
*入口参数:(无)
*出口参数:(无)
*返回值:(无)
*/
void CCanBusInterface::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 CCanBusInterface::ReadBuffer()
{
	return m_pMapPointer;
}

/*
*函数介绍:写入内存映射文件内容
*入口参数:buf :要写入的字符串数据指针
*出口参数:(无)
*返回值:-1 :失败;1:成功
*/
DWORD CCanBusInterface::WriteBuffer(const char * buf, DWORD bufSize)
{
	if (bufSize > m_MaxSize)
	{
		return -1; //写入缓冲区,大于定义大小
	}
	//同步写过程,等待同步信号,且等到同步信号,自动关闭信号
	//if (WaitForSingleObject(m_hSynEvent,INFINITE) == WAIT_OBJECT_0)
	//{
		//数据拷贝
		memcpy(m_pMapPointer,buf,bufSize);
	//}

	::SendMessage(HWND_BROADCAST,m_SynMessageID,WPARAM(m_hWnd),0);
	//使同步事件有信号
	//SetEvent(m_hSynEvent);
	return 1;
}

/*
*函数介绍:写入内存映射文件内容
*入口参数:buf :要写入的字符串数据指针
*出口参数:(无)
*返回值:-1 :失败;1:成功
*/
LRESULT CCanBusInterface::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 + -