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

📄 myfilemap.cpp

📁 虚拟打印机
💻 CPP
字号:
/* *  * myfilemap.c *   Copyright (C) 2006 Michael H. Overlin   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      Contact at poster_printer@yahoo.com */ #include "myfilemap.h"#include "utils.h"#include <windows.h> MyFileMap::MyFileMap(void) {	this->hFile = INVALID_HANDLE_VALUE;	this->hMap = NULL;	this->lpMap = NULL;	this->dwSize = 0;}MyFileMap::~MyFileMap() {	if (IsOpen()) {		this->Close();	}}BOOL MyFileMap::Open(const tstring& tstr) {	BOOL bRetValue = FALSE;	HANDLE hFile = INVALID_HANDLE_VALUE;	HANDLE hMap = NULL;	LPVOID lpMap = NULL;	try {		hFile = CreateFile( 			tstr.c_str(),			GENERIC_READ,           			FILE_SHARE_READ,        			NULL,                   			OPEN_EXISTING,          			FILE_ATTRIBUTE_NORMAL,  			NULL                     			);		if (hFile != INVALID_HANDLE_VALUE) {			hMap = CreateFileMapping(				hFile,				NULL,				PAGE_READONLY,				0,				0,				NULL				);					if (hMap != NULL) {				lpMap = MapViewOfFile(					hMap,					FILE_MAP_READ,					0,					0,					NULL					);				if (lpMap != NULL) {					this->dwSize = GetFileSize(hFile, NULL);					this->hFile = hFile;					this->hMap = hMap;					this->lpMap = lpMap;					bRetValue = TRUE;				}			}		}		if (!bRetValue) {			if (lpMap != NULL) {				UnmapViewOfFile(lpMap);			}			if (hMap != NULL) {				CloseHandle(hMap);			}			if (hFile != INVALID_HANDLE_VALUE) {				CloseHandle(hFile);			}		}	} catch(...) {		bRetValue = FALSE;		if (lpMap != NULL) {			try { UnmapViewOfFile(lpMap); } catch(...) {}		}		if (hMap != NULL) {			try { CloseHandle(hMap); } catch (...) {}		}		if (hFile != INVALID_HANDLE_VALUE) {			try { CloseHandle(hFile); } catch (...) {}		}	}	return bRetValue;}void MyFileMap::Close(void) {	ASSERT(this->lpMap != NULL);	ASSERT(this->hMap != NULL);	ASSERT(this->hFile != INVALID_HANDLE_VALUE);	// SO I DON'T HAVE TO DEAL WITH EXCEPTIONS	// TO ENSURE OBJECT STAYS IN VALID STATE BELOW	// IF EXCEPTION OCCURS, LET HANDLES HANG (FOR NOW)	LPVOID lpMap = this->lpMap;	HANDLE hMap = this->hMap;	HANDLE hFile = this->hFile;	this->lpMap = NULL;	this->hMap = NULL;	this->hFile = INVALID_HANDLE_VALUE;	this->dwSize = 0;	UnmapViewOfFile(lpMap);	CloseHandle(hMap);	CloseHandle(hFile);}const void* MyFileMap::GetBasePtr(VOID) const { 	ASSERT(this->IsOpen());	return this->lpMap; }const void* MyFileMap::GetOffsetPtr(const DWORD dwOffset) const {	PCBYTE lp = (PCBYTE) GetBasePtr();	ASSERT(dwOffset < this->dwSize);	return (LPCVOID) (lp + dwOffset);}DWORD MyFileMap::GetSize(VOID) const { 	ASSERT(this->IsOpen());	return this->dwSize; }// ****************************************************************************************MyFileReadWriteMap::MyFileReadWriteMap(void) {	this->hFile = INVALID_HANDLE_VALUE;	this->hMap = NULL;	this->lpMap = NULL;	this->dwSize = 0;}MyFileReadWriteMap::~MyFileReadWriteMap() {	if (IsOpen()) {		this->Close();	}}BOOL MyFileReadWriteMap::Create(const tstring& tstr, DWORD dwCb) {	BOOL bRetValue = FALSE;	HANDLE hFile = INVALID_HANDLE_VALUE;	HANDLE hMap = NULL;	LPVOID lpMap = NULL;	try {		hFile = CreateFile( 			tstr.c_str(),			GENERIC_READ | GENERIC_WRITE,			FILE_SHARE_READ,        			NULL,                   			CREATE_ALWAYS,          			FILE_ATTRIBUTE_NORMAL,  			NULL                     			);		if (hFile != INVALID_HANDLE_VALUE) {			hMap = CreateFileMapping(				hFile,				NULL,				PAGE_READWRITE,				0,				dwCb,				NULL				);					if (hMap != NULL) {				lpMap = MapViewOfFile(					hMap,					FILE_MAP_WRITE,					0,					0,					dwCb					);				if (lpMap != NULL) {					this->dwSize = dwCb;					this->hFile = hFile;					this->hMap = hMap;					this->lpMap = lpMap;					bRetValue = TRUE;				}			}		}		if (!bRetValue) {			if (lpMap != NULL) {				UnmapViewOfFile(lpMap);			}			if (hMap != NULL) {				CloseHandle(hMap);			}			if (hFile != INVALID_HANDLE_VALUE) {				CloseHandle(hFile);			}		}	} catch(...) {		bRetValue = FALSE;		if (lpMap != NULL) {			try { UnmapViewOfFile(lpMap); } catch(...) {}		}		if (hMap != NULL) {			try { CloseHandle(hMap); } catch (...) {}		}		if (hFile != INVALID_HANDLE_VALUE) {			try { CloseHandle(hFile); } catch (...) {}		}	}	return bRetValue;}void MyFileReadWriteMap::Close(void) {	ASSERT(this->lpMap != NULL);	ASSERT(this->hMap != NULL);	ASSERT(this->hFile != INVALID_HANDLE_VALUE);	// SO I DON'T HAVE TO DEAL WITH EXCEPTIONS	// TO ENSURE OBJECT STAYS IN VALID STATE BELOW	// IF EXCEPTION OCCURS, LET HANDLES HANG (FOR NOW)	LPVOID lpMap = this->lpMap;	HANDLE hMap = this->hMap;	HANDLE hFile = this->hFile;	this->lpMap = NULL;	this->hMap = NULL;	this->hFile = INVALID_HANDLE_VALUE;	this->dwSize = 0;	UnmapViewOfFile(lpMap);	CloseHandle(hMap);	CloseHandle(hFile);}void* MyFileReadWriteMap::GetBasePtr(void)  { 	ASSERT(this->IsOpen());	return this->lpMap; }void* MyFileReadWriteMap::GetOffsetPtr(const DWORD dwOffset)  {	PCBYTE lp = (PCBYTE) GetBasePtr();	ASSERT(dwOffset < this->dwSize);	return (void *) (lp + dwOffset);}DWORD MyFileReadWriteMap::GetSize(VOID) const { 	ASSERT(this->IsOpen());	return this->dwSize; }HANDLE MyFileReadWriteMap::GetFileMapHandle(void) {	return this->hMap;}

⌨️ 快捷键说明

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