You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/SSBase/DrawLocal/FileMappingBase.h

180 lines
6.0 KiB
C

1 month ago
/////////////////////////////////////////////////////////////////////////////
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
// <09>ļ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2008-11-09
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
namespace NFile64
{
////////////////////////////////////////////////////////////////////////////////////////////////
// ģ<><C4A3>: <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC>û<EFBFBD><C3BB><EFBFBD>
// ˵<><CBB5>:
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ڴ湲<DAB4><E6B9B2>
////////////////////////////////////////////////////////////////////////////////////////////////
class CFileMappingBase : public CObject
{
DECLARE_DYNAMIC(CFileMappingBase)
public:
CFileMappingBase(void);
virtual ~CFileMappingBase(void);
//<2F><>ӳ<EFBFBD><D3B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫָ<D2AA><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ij<EFBFBD><C4B3>ȡ<EFBFBD>
//<2F><><EFBFBD>У<EFBFBD><D0A3>ļ<EFBFBD><C4BC><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ<EFBFBD><D6B7>64λֵ<CEBB><D6B5>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD>ϵͳ<CFB5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD>'\'<27>滻Ϊ<E6BBBB><CEAA>'_'
CString CreateMappingName(const CString& sName);
//Create and open/////////////////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>䣬ȱʡ<C8B1><CAA1><EFBFBD><EFBFBD>ֻ<EFBFBD>ܶ<EFBFBD><DCB6>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4>ڣ<EFBFBD><DAA3><EFBFBD>(32λѰַ)ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ƫ<EFBFBD>Ƶ<EFBFBD>ַnOffset,<2C><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>Զ<EFBFBD><D4B6><EFBFBD>nOffsetȡ<74>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL Open(
LPCTSTR lpszFilePath,
LPCTSTR lpszMappingName,
SIZE_T nMappingSize = 0,
ULONGLONG nOffset = 0,
DWORD dwFileDesiredAccess = GENERIC_READ,
DWORD dwMappingProtection = PAGE_READONLY,
DWORD dwViewDesiredAccess = FILE_MAP_READ
);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><E4A3AC><EFBFBD>Զ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ж<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>,<2C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Ƕ<EFBFBD>Open<65><6E><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>װ
BOOL OpenWrite(
LPCTSTR lpszFilePath,
LPCTSTR lpszMappingName,
SIZE_T nMappingSize/* = 0*/,
ULONGLONG nOffset/* = 0*/
);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
BOOL MapFile(
HANDLE hFile,
LPCTSTR lpszMappingName,
SIZE_T nMappingSize = 0,
ULONGLONG nOffset = 0,
DWORD dwMappingProtection = PAGE_READONLY,
DWORD dwViewDesiredAccess = FILE_MAP_READ
);
//ֱ<>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OpenMapping<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
BOOL MapSharedMem(
LPCTSTR lpszMappingName,
SIZE_T nMappingSize, //>0
BOOL* pbAlreadyExisted = NULL,
LPSECURITY_ATTRIBUTES lpsa = NULL,
DWORD dwMappingProtection = PAGE_READWRITE,
DWORD dwViewDesiredAccess = FILE_MAP_ALL_ACCESS
);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OpenMapping<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ治<DAB4><E6B2BB>ʱֱ<CAB1><D6B1>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>Ӳ<EFBFBD><D3B2><EFBFBD>ļ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ڴ<EFBFBD><DAB4>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>
BOOL MapFileSharedMem(
LPCTSTR lpszMappingName,
SIZE_T nMappingSize, //>0
BOOL* pbAlreadyExisted = NULL,
LPSECURITY_ATTRIBUTES lpsa = NULL,
DWORD dwMappingProtection = PAGE_READWRITE,
DWORD dwViewDesiredAccess = FILE_MAP_ALL_ACCESS
);
//Open mapping//////////////////////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ӳ<EFBFBD><D3B3>
BOOL OpenMapping(
LPCTSTR lpszMappingName,
SIZE_T nMappingSize = 0, //default max. object size
ULONGLONG nOffset = 0, //default map entire file
DWORD dwViewDesiredAccess = FILE_MAP_READ //<2F><>дʱ<D0B4><CAB1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ FILE_MAP_ALL_ACCESS
);
//Remap view///////////////////////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>4Gʱ<47><CAB1><EFBFBD><EFBFBD>Ҫӳ<D2AA><D3B3><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>ƫ<EFBFBD>Ƽ<EFBFBD>ӳ<EFBFBD><EFBFBD><E4B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
BOOL OpenNextMapping(
SIZE_T nMappingSize,
ULONGLONG nOffset
);
//Write/////////////////////////////////////////////////////////////////////////////////////////////////////////
//<2F><>ӳ<EFBFBD><D3B3><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
BOOL Save(
void* lpBaseAddress=NULL, //Ϊ<><CEAA>ʱ<EFBFBD><CAB1>ʾдȫ<D0B4><C8AB>ӳ<EFBFBD><D3B3>
SIZE_T dwNumberOfBytesToFlush=0 //Ϊ0ʱ<30><CAB1>ʾ<EFBFBD><CABE>lpBaseAddress<73><73>ַ<EFBFBD><D6B7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>β
);
BOOL SaveAs(LPCTSTR lpFileName); //<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
DWORD GetErrorMessage(bool bMessageBox=true); //<2F><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44>,<2C><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD>һ<EFBFBD><D2BB>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
BOOL IsCanWrite(void); //<2F>ж<EFBFBD><D0B6>Ѵ򿪵<D1B4>ӳ<EFBFBD><D3B3><EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
BOOL IsOpen(void); //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ӳ<EFBFBD><D3B3>
void Close(void); //<2F>ر<EFBFBD>ӳ<EFBFBD>䣬ͬUnmap()
void Unmap(void); //<2F>ر<EFBFBD>ӳ<EFBFBD><D3B3>
void* GetData(void); //<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>Ŀ<EFBFBD>ʼָ<CABC><D6B8>
SIZE_T GetMappingSize(void); //<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ָ<EFBFBD><D6B8>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>СʱΪ0
ULONGLONG GetOffset(void); //<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
HANDLE GetHandle(void); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC>ľ<EFBFBD><C4BE><EFBFBD>
ULONGLONG GetPosition(void); //<2F><><EFBFBD>õ<EFBFBD>ǰλ<C7B0><CEBB>
BOOL Seek(ULONGLONG nOffset, int nOrigin); //<2F><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD>ʼʱnOffset<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>,<2C><>Ϊ<EFBFBD><CEAA>βʱ<CEB2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>ȵ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
SIZE_T Read(char* value, SIZE_T nLength); //<2F>ӵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EAB4A6>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>value<75>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nLength<74><68><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1>µ<EFBFBD>λ<EFBFBD><CEBB>
char* GetCursor(void); //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>ָ<EFBFBD><D6B8>
//Other////////////////////////////////////////////////////////////////////////////////////////////////////////
//<2F><>̬<EFBFBD><CCAC>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ϵͳ<CFB5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>õ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>С<EFBFBD>ڴ浥λ,<2C><><EFBFBD><EFBFBD>Windows<77><73><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȹ̶<C8B9>Ϊ64KB
DWORD GetSysAllocationGranularity(void);
ULONGLONG GetFileLength(void); //<2F><><EFBFBD>ñ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC>ij<EFBFBD><C4B3><EFBFBD>
CString GetFileName(void); //<2F><><EFBFBD>ñ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
virtual void AfterMapViewSucceed(void);
char* m_lpCursor;
private:
void* m_pData;
HANDLE m_hMapping; //ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HANDLE m_hPhysicsFile; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪOpenMappingʱΪ<CAB1><CEAA>
ULONGLONG m_nFileLength; //<2F><>ǰ<EFBFBD><C7B0>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD>ΪOpenMappingʱΪ0
CString m_strFileName; //<2F><>ǰ<EFBFBD><C7B0>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ΪOpenMappingʱΪ<CAB1><CEAA>
DWORD m_dwAlign; //ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>С<EFBFBD>ڴ浥λ,<2C><><EFBFBD><EFBFBD>Windows<77><73><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȹ̶<C8B9>Ϊ64KB
ULARGE_INTEGER m_nOffset; //ƫ<><C6AB>
SIZE_T m_nMappingSize; //ӳ<><EFBFBD><E4B3A4>
DWORD m_dwViewDesiredAccess;
BOOL MapView(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>úõIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ַ
};
};
using namespace NFile64;
ULONGLONG GetFileLength(LPCTSTR lpFileName); //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֵ<0ʱ<30><CAB1>ʾ<EFBFBD><CABE><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline void* CFileMappingBase::GetData(void)
{
return m_pData;
}
inline SIZE_T CFileMappingBase::GetMappingSize(void)
{
return m_nMappingSize;
}
inline HANDLE CFileMappingBase::GetHandle(void)
{
return m_hMapping;
}
inline ULONGLONG CFileMappingBase::GetOffset(void)
{
return m_nOffset.QuadPart;
}
inline char* CFileMappingBase::GetCursor(void)
{
return m_lpCursor;
}