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

📄 sourcebuffer.cpp

📁 电视字幕卡调用DLL模块
💻 CPP
字号:
#include "stdafx.h"

#include "SourceBuffer.h"

CSourceBuffer::CSourceBuffer ( HANDLE hFileHandle )
: m_hFileHandle ( hFileHandle )
, m_hFileMap ( NULL )
, m_llInBuffer ( 0 )
, m_llOutBuffer ( 0 )
{
	m_llFileLength.LowPart = ::GetFileSize ( m_hFileHandle, &m_llFileLength.HighPart );
	m_llInBuffer = m_llFileLength.QuadPart;

	_ASSERT ( INVALID_HANDLE_VALUE != m_hFileHandle );
	m_hFileMap = ::CreateFileMapping ( m_hFileHandle, 
		                               NULL,
									   PAGE_READONLY,
									   0,
									   0,
									   NULL );
	_ASSERT ( NULL != m_hFileMap );
	::GetSystemInfo ( &m_tagSinf );
//	dwTmp = 1024 * 1024 * 8;
	m_dwAllocationGranularity = m_tagSinf.dwAllocationGranularity;
	m_llFileLengthTmp = 0;
}

CSourceBuffer::~CSourceBuffer ( )
{
	if ( m_hFileMap ) {
		CloseHandle ( m_hFileMap );
		m_hFileMap = NULL;
	}

	m_llInBuffer = 0;
	m_llOutBuffer = 0;

};

// true - success
BOOL CSourceBuffer::GetFileData ( DWORD *dwDWord, DWORD *dwDataLength )
{
	DWORD	dwBytesInBlock, dwTmpOut;
	DWORD   dwRemain = (DWORD)(m_llInBuffer - m_llOutBuffer);
	PBYTE	pbData;
	
	if ( m_llOutBuffer >= m_llInBuffer ) return FALSE;
	if (*dwDataLength > dwRemain) *dwDataLength = dwRemain;

//	if ( (m_llInBuffer - m_llFileLengthTmp) < m_dwAllocationGranularity )
//			dwBytesInBlock = m_dwAllocationGranularity;
//	else dwBytesInBlock = *dwDataLength;
	dwTmpOut = (DWORD)(m_llOutBuffer - m_llFileLengthTmp);
	dwBytesInBlock = *dwDataLength + dwTmpOut;
	pbData = ( PBYTE )::MapViewOfFile ( m_hFileMap,
							 FILE_MAP_READ,
							 (DWORD) ( m_llFileLengthTmp >> 32),
							 (DWORD) ( m_llFileLengthTmp & 0xFFFFFFFF ),
							 dwBytesInBlock );
	if ( NULL == pbData ) {
		::MessageBox ( NULL, "The Map File Failed", "Error", MB_OK );
		return FALSE;
	}
	memcpy((void *)dwDWord, (void *)(pbData + dwTmpOut), *dwDataLength);
	UnmapViewOfFile ( pbData );
	m_llFileLengthTmp += (*dwDataLength / m_dwAllocationGranularity) * m_dwAllocationGranularity;
	m_llOutBuffer += *dwDataLength;

	return TRUE;
}

void CSourceBuffer::ForwardJump ( DWORD dwDWord )
{
	m_llOutBuffer += ( LONGLONG ) dwDWord;
	m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}

void CSourceBuffer::BackwardJump ( DWORD dwDWord )
{
	if ( (m_llOutBuffer - dwDWord) > 0) m_llOutBuffer -= dwDWord;
	else m_llOutBuffer = 0;
	m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;

}

void CSourceBuffer::JumpToEnd ( DWORD dwBytes )
{
	SetFilePointer (m_hFileHandle, dwBytes, NULL, FILE_END);
	m_llOutBuffer = m_llInBuffer - dwBytes;
	m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}

void CSourceBuffer::JumpToBegin ( DWORD dwBytes )
{
	SetFilePointer (m_hFileHandle, dwBytes, NULL, FILE_BEGIN);
	m_llOutBuffer = ( LONGLONG ) dwBytes;
	m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}

⌨️ 快捷键说明

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