📄 atlfile_fixed.h
字号:
//
// This is a modification of ATL::CAtlFileMappingBase() that is included
// in MSVC++ 7.0.
//
// Changes:
// 1) The pszName parameter was added to MapFile() so that
// the file mapping could be named.
//
#ifndef __ATLFILE_FIXED_H__
#define __ATLFILE_FIXED_H__
#pragma once
#include <atlbase.h>
namespace PUB
{
class CAtlFileMappingBase
{
public:
CAtlFileMappingBase() throw()
{
m_pData = NULL;
m_hMapping = NULL;
}
~CAtlFileMappingBase() throw()
{
Unmap();
}
// FIXED: Added the pszName parameter
HRESULT MapFile(
HANDLE hFile,
SIZE_T nMappingSize = 0,
ULONGLONG nOffset = 0,
DWORD dwMappingProtection = PAGE_READONLY,
DWORD dwViewDesiredAccess = FILE_MAP_READ,
LPCTSTR pszName = NULL) throw()
{
ATLASSERT(m_pData == NULL);
ATLASSERT(m_hMapping == NULL);
ATLASSERT(hFile != INVALID_HANDLE_VALUE && hFile != NULL);
ULARGE_INTEGER liFileSize;
liFileSize.LowPart = ::GetFileSize(hFile, &liFileSize.HighPart);
if (liFileSize.QuadPart < nMappingSize)
liFileSize.QuadPart = nMappingSize;
m_hMapping = ::CreateFileMapping(hFile, NULL, dwMappingProtection, liFileSize.HighPart, liFileSize.LowPart, pszName);
if (m_hMapping == NULL)
return AtlHresultFromLastError();
if (nMappingSize == 0)
m_nMappingSize = (SIZE_T) (liFileSize.QuadPart - nOffset);
else
m_nMappingSize = nMappingSize;
m_dwViewDesiredAccess = dwViewDesiredAccess;
m_nOffset.QuadPart = nOffset;
m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL);
if (m_pData == NULL)
{
HRESULT hr;
hr = AtlHresultFromLastError();
::CloseHandle(m_hMapping);
m_hMapping = NULL;
return hr;
}
return S_OK;
}
HRESULT MapSharedMem(
SIZE_T nMappingSize,
LPCTSTR szName,
BOOL* pbAlreadyExisted = NULL,
LPSECURITY_ATTRIBUTES lpsa = NULL,
DWORD dwMappingProtection = PAGE_READWRITE,
DWORD dwViewDesiredAccess = FILE_MAP_ALL_ACCESS) throw()
{
ATLASSERT(m_pData == NULL);
ATLASSERT(m_hMapping == NULL);
ATLASSERT(nMappingSize > 0);
ATLASSERT(szName != NULL); // if you just want a regular chunk of memory, use a heap allocator
m_nMappingSize = nMappingSize;
ULARGE_INTEGER nSize;
nSize.QuadPart = nMappingSize;
m_hMapping = ::CreateFileMapping(NULL, lpsa, dwMappingProtection, nSize.HighPart, nSize.LowPart, szName);
if (m_hMapping == NULL)
return AtlHresultFromLastError();
if (pbAlreadyExisted != NULL)
*pbAlreadyExisted = (GetLastError() == ERROR_ALREADY_EXISTS);
m_dwViewDesiredAccess = dwViewDesiredAccess;
m_nOffset.QuadPart = 0;
m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL);
if (m_pData == NULL)
{
HRESULT hr;
hr = AtlHresultFromLastError();
::CloseHandle(m_hMapping);
return hr;
}
return S_OK;
}
HRESULT OpenMapping(
LPCTSTR szName,
SIZE_T nMappingSize,
ULONGLONG nOffset = 0,
DWORD dwViewDesiredAccess = FILE_MAP_ALL_ACCESS) throw()
{
ATLASSERT(m_pData == NULL);
ATLASSERT(m_hMapping == NULL);
ATLASSERT(nMappingSize > 0);
ATLASSERT(szName != NULL); // if you just want a regular chunk of memory, use a heap allocator
m_nMappingSize = nMappingSize;
m_dwViewDesiredAccess = dwViewDesiredAccess;
m_hMapping = ::OpenFileMapping(m_dwViewDesiredAccess, FALSE, szName);
if (m_hMapping == NULL)
return AtlHresultFromLastError();
m_dwViewDesiredAccess = dwViewDesiredAccess;
m_nOffset.QuadPart = nOffset;
m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL);
if (m_pData == NULL)
{
HRESULT hr;
hr = AtlHresultFromLastError();
::CloseHandle(m_hMapping);
return hr;
}
return S_OK;
}
HRESULT Unmap() throw()
{
HRESULT hr = S_OK;
if (m_pData != NULL)
{
if (!::UnmapViewOfFile(m_pData))
hr = AtlHresultFromLastError();
m_pData = NULL;
}
if (m_hMapping != NULL)
{
if (!::CloseHandle(m_hMapping) && SUCCEEDED(hr))
hr = AtlHresultFromLastError();
m_hMapping = NULL;
}
return hr;
}
void* GetData() const throw()
{
return m_pData;
}
HANDLE GetHandle() const throw()
{
return m_hMapping;
}
SIZE_T GetMappingSize() throw()
{
return m_nMappingSize;
}
HRESULT CopyFrom(CAtlFileMappingBase& orig) throw()
{
ATLASSERT(m_pData == NULL);
ATLASSERT(m_hMapping == NULL);
ATLASSERT(orig.m_pData != NULL);
ATLASSERT(orig.m_hMapping != NULL);
m_dwViewDesiredAccess = orig.m_dwViewDesiredAccess;
m_nOffset.QuadPart = orig.m_nOffset.QuadPart;
m_nMappingSize = orig.m_nMappingSize;
if (!::DuplicateHandle(GetCurrentProcess(), orig.m_hMapping, GetCurrentProcess(),
&m_hMapping, NULL, TRUE, DUPLICATE_SAME_ACCESS))
return AtlHresultFromLastError();
m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL);
if (m_pData == NULL)
{
HRESULT hr;
hr = AtlHresultFromLastError();
::CloseHandle(m_hMapping);
m_hMapping = NULL;
return hr;
}
return S_OK;
}
CAtlFileMappingBase(CAtlFileMappingBase& orig)
{
m_pData = NULL;
m_hMapping = NULL;
HRESULT hr = CopyFrom(orig);
if (FAILED(hr))
AtlThrow(hr);
}
CAtlFileMappingBase& operator=(CAtlFileMappingBase& orig)
{
HRESULT hr = CopyFrom(orig);
if (FAILED(hr))
AtlThrow(hr);
return *this;
}
private:
void* m_pData;
SIZE_T m_nMappingSize;
HANDLE m_hMapping;
ULARGE_INTEGER m_nOffset;
DWORD m_dwViewDesiredAccess;
};
template <typename T = char>
class CAtlFileMapping : public CAtlFileMappingBase
{
public:
operator T*() const throw()
{
return reinterpret_cast<T*>(GetData());
}
};
}; //namespace PUB
#endif //__ATLFILE_FIXED_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -