?? memfilemap.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 + -