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

📄 codecwizarddlg.h

📁 多种编解码的小程序
💻 H
📖 第 1 页 / 共 4 页
字号:
// CodecWizardDlg.h : header file
//

#if !defined(AFX_CODECWIZARDDLG_H__945F034D_C3CB_4CCB_8D8A_2B048B70D693__INCLUDED_)
#define AFX_CODECWIZARDDLG_H__945F034D_C3CB_4CCB_8D8A_2B048B70D693__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CCodecWizardDlg dialog

#include <assert.h>

#define CSCLSAPI

#define ABORTON(condition) do{if(condition) return;}while(0)
#define ABORTONACT(condition,action) do{if(condition){action;return;}}while(0)
#define EXITON(condition,value) do{if(condition) return (value);}while(0)
#define EXITONACT(condition,value,action) do{if(condition){action;return (value);}}while(0)
#define ACT2(act1,act2) do{act1;act2;}while(0)
#define ACT3(act1,act2,act3) do{act1;act2;act3;}while(0)
#define ACT4(act1,act2,act3,act4) do{act1;act2;act3;act4;}while(0)
#define ACT5(act1,act2,act3,act4,act5) do{act1;act2;act3;act4;act5;}while(0)
#define ZEROA(arr) memset((void *)arr,0,sizeof(arr))
#define ZEROS(str) memset(&str,0,sizeof(str))
#define ZEROP(p,nSize) memset(p,0,(nSize))
#define ENSURE(x) do{BOOL b = x;assert(b);}while(0)
//禁止生成拷贝构造函数
#define NOCPCTOR(c)\
	private:\
	explicit c(const c& Obj);\
c& operator = (const c& Obj)
//创建线程
#define FORK(nStackSize,fn,pThis,nTID)\
(HANDLE)_beginthreadex(NULL,(nStackSize),(unsigned ( __stdcall *)( void * ))&fn,pThis,0,(UINT *)&nTID)
//创建线程,允许指定启动参数
#define FORKEX(nStackSize,fn,pThis,dwFlags,nTID)\
(HANDLE)_beginthreadex(NULL,(nStackSize),(unsigned ( __stdcall *)( void * ))&fn,pThis,dwFlags,(UINT *)&nTID)


class CSCLSAPI CCSAutoMem
{
	CSCLS_NO_COPYCONSTRUCTOR(CCSAutoMem);
public:
	int m_nSize;	//缓冲区大小,字节数
	char *m_pBuf;	//缓冲区指针
public:
	void Free()
	{
		if(m_pBuf) delete [] m_pBuf;
		m_pBuf = NULL;
		m_nSize = 0;
	};
	char* Detach(BOOL bDelete=FALSE)
	{
		PSTR p = m_pBuf;
		m_pBuf = NULL;
		m_nSize = 0;
		if(p && bDelete) Free();
		return p;
	};
	char* Attach(char *strBuf,int nSize=0,BOOL bDeletePrev=TRUE)
	{
		PSTR p = Detach(bDeletePrev);
		m_pBuf = strBuf;
		m_nSize = nSize;
		if(m_nSize<=0 && m_pBuf) m_nSize = strlen(m_pBuf) + 1;
		return p;
	};
	char* Allocate(int nSize)
	{
		Detach(TRUE);
		m_pBuf = new char[nSize];
		if(m_pBuf)
		{
			m_nSize = nSize;
			ZEROP(m_pBuf,nSize);
		}
		return m_pBuf;
	};
	operator PSTR()
	{
		assert(m_pBuf);
		return m_pBuf;
	};
	char& operator[](int nIdx)
	{
		assert(m_pBuf!=NULL && m_nSize>nIdx);
		return m_pBuf[nIdx];
	};
public:
	CCSAutoMem()
	{
		m_nSize = 0;
		m_pBuf = NULL;
	};
	CCSAutoMem(int nSize)
	{
		m_nSize = 0;
		m_pBuf = NULL;
		Allocate(nSize);
	};
	CCSAutoMem(PSTR strBuf,int nSize)
	{
		m_nSize = 0;
		m_pBuf = NULL;
		Attach(strBuf,nSize,TRUE);
	};
	~CCSAutoMem()
	{
		Free();
	};
};

class DiskFile
{
public:
	HANDLE m_hFile;
public:
	void Close()
	{
		if(m_hFile!=INVALID_HANDLE_VALUE) CloseHandle(m_hFile);
		m_hFile = INVALID_HANDLE_VALUE;
	};
	BOOL Open(LPCSTR strFileName,DWORD dwAccess,DWORD dwOpen,DWORD dwShare=FILE_SHARE_READ)
	{
		Close();
		m_hFile	= CreateFile(strFileName,dwAccess,dwShare,NULL,dwOpen,0,NULL);
		return m_hFile!=INVALID_HANDLE_VALUE;
	};
	DWORD Read(PVOID pvBuf,int nBufSize)
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return 0;
		DWORD dw = 0;
		if(!ReadFile(m_hFile,pvBuf,nBufSize,&dw,NULL)) return 0;
		return dw;
	};
	DWORD Write(PVOID pvData,int nDataSize)
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return 0;
		DWORD dw = 0;
		if(!WriteFile(m_hFile,pvData,nDataSize,&dw,NULL)) return 0;
		return dw;
	};
	DWORD Write(LPCSTR strData)
	{
		return Write((PVOID)strData,strlen(strData));
	};
	BOOL Rewind()
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return FALSE;
		SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
		return TRUE;
	};
	BOOL GoToEnd()
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return FALSE;
		SetFilePointer(m_hFile,0,NULL,FILE_END);
		return TRUE;
	};
	DWORD GetSize()
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return 0;
		return GetFileSize(m_hFile,NULL);
	};
	BOOL Seek(LONG lngOffset,BOOL bFromBegin)
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return FALSE;
		SetFilePointer(m_hFile,lngOffset,NULL,bFromBegin ? FILE_BEGIN : FILE_END);
		return TRUE;
	};
	BOOL Empty()
	{
		if(m_hFile==INVALID_HANDLE_VALUE) return FALSE;
		SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
		SetEndOfFile(m_hFile);
		return TRUE;
	};
public:
	DiskFile()
	{
		m_hFile = INVALID_HANDLE_VALUE;
	};
	DiskFile(LPCSTR strFileName,DWORD dwAccess,DWORD dwOpen,DWORD dwShare)
	{
		Open(strFileName,dwAccess,dwShare);
	};
	~DiskFile()
	{
		Close();
	};
};

template <class T>
class GMemory
{
public:
	int m_nSize;
	T *m_pT;
public:
	void Free()
	{
		if(m_pT) GlobalFree((HGLOBAL)m_pT);
		m_pT = NULL;
		m_nSize = 0;
	};
	T* Alloc(int nSize)
	{
		Free();
		m_pT = (T *)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,nSize);
		m_nSize = nSize;
		return m_pT;
	};
	T* Detach()
	{
		T *pT = m_pT;
		m_pT = NULL;
		m_nSize = 0;
		return pT;
	};
	void Attach(T *pT,int nSize)
	{
		Free();
		m_pT = pT;
		m_nSize = nSize;
	};
public:
	GMemory()
	{
		m_pT = NULL;
		m_nSize = 0;
	};
	GMemory(int nSize)
	{
		Alloc(nSize);
	};
	~GMemory()
	{
		Free();
	};
};

class GMLock
{
	BOOL m_bLocked;
	PSTR m_strBuf;
	HGLOBAL m_hMem;
	int m_nDataSize;
public:
	HGLOBAL GetHandle() const
	{
		return m_hMem;
	};
	int GetDataSize() const
	{
		return m_nDataSize;
	};
	PSTR GetBuffer() const
	{
		return m_strBuf;
	};
public:
	PSTR Lock()
	{
		if(!m_hMem) return NULL;
		if(m_bLocked) return m_strBuf;
		m_nDataSize = (int)GlobalSize(m_hMem);
		if(m_nDataSize<=0) return NULL;
		m_strBuf = (PSTR)GlobalLock(m_hMem);
		m_bLocked = m_strBuf!=NULL;
		return m_strBuf;
	};
	void Unlock()
	{
		if(m_bLocked && m_hMem) GlobalUnlock(m_hMem);
		m_strBuf = NULL;
		m_nDataSize = 0;
		m_bLocked = FALSE;
	};
public:
	GMLock(HGLOBAL hMem)
	{
		m_hMem = hMem;
		m_bLocked = FALSE;
		m_strBuf = NULL;
		m_nDataSize = 0;
		Lock();
	};
	~GMLock()
	{
		Unlock();
	}
};

class GMAllocator
{
	HGLOBAL m_hMem;
public:
	HGLOBAL GetHandle() const
	{
		return m_hMem;
	};
	void Free()
	{
		if(m_hMem) GlobalFree(m_hMem);
		m_hMem = NULL;
	};
	HGLOBAL Allocate(PSTR strData,int nDataSize)
	{
		Free();
		if(!strData || nDataSize<=0) return NULL;
		m_hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,(DWORD)nDataSize);
		if(m_hMem)
		{
			GMLock gl(m_hMem);
			memcpy(gl.GetBuffer(),strData,nDataSize);
		}
		return m_hMem;
	};
	HGLOBAL Detach()
	{
		HGLOBAL h = m_hMem;
		m_hMem = NULL;
		return h;
	};
public:
	GMAllocator()
	{
		m_hMem = NULL;
	};
	~GMAllocator()
	{
		Free();
	};
};

template <class T>
class NMemory
{
public:
	int m_nSize;
	T *m_pT;
public:
	void Free()
	{
		if(m_pT) delete [] m_pT;
		m_pT = NULL;
		m_nSize = 0;
	};
	T* Alloc(int nSize)
	{
		Free();
		m_pT = (T *)new char[nSize];
		m_nSize = nSize;
		if(m_pT) memset(m_pT,0,nSize);
		return m_pT;
	};
	T* Detach()
	{
		T *pT = m_pT;
		m_pT = NULL;
		m_nSize = 0;
		return pT;
	};
	void Attach(T *pT,int nSize)
	{
		Free();
		m_pT = pT;
		m_nSize = nSize;
	};
public:
	NMemory()
	{
		m_pT = NULL;
		m_nSize = 0;
	};
	NMemory(int nSize)
	{
		Alloc(nSize);
	};
	~NMemory()
	{
		Free();
	};
};

template <class T>
class Object
{
public:
	T *m_pT;
public:
	void Free()
	{
		if(m_pT) delete m_pT;
		m_pT = NULL;
	};
	T* Alloc()
	{
		Free();
		m_pT = new T;
		return m_pT;
	};
	T* Detach()
	{
		T *pT = m_pT;
		m_pT = NULL;
		return pT;
	};
	void Attach(T *pT)
	{
		Free();
		m_pT = pT;
	};
	T* operator->()
	{
		assert(m_pT);
		return m_pT;
	};
public:
	Object()
	{
		m_pT = NULL;
		Alloc();
	};
	~Object()
	{
		Free();
	};
};

template<class T>
class Destructor
{
	T *m_pT;
public:
	Destructor(T& t)
	{
		m_pT = &t;
	};
	~Destructor()
	{
		if(m_pT) delete m_pT;
	};
	T* operator->()
	{
		return m_pT;
	};
};

//===ByteArray===
enum BITARRAYOPTIONS
{
	_DEFAULT_GROWSIZE = 16,
};
class CSCLSAPI ByteArray
{
	int m_nGrowSize;		//当内部缓冲区不够大时,每次增长的字节数
	int m_nDataSize;		//有效数据的字节数
	int m_nTotalSize;		//内部缓冲区的字节数
	BYTE *m_byData;		//内部缓冲区的指针
public:
	int GetDataSize() const{return m_nDataSize;};
	int GetTotalSize() const{return m_nTotalSize;};
	int GetGrowSize() const{return m_nGrowSize;};
	PSTR GetDataPSTR() const{return (PSTR)m_byData;};
	PCSTR GetDataPCSTR() const{return (PCSTR)m_byData;};
	PBYTE GetDataPBYTE() const{return m_byData;};
	void SetGrowSize(int nGrowSize=_DEFAULT_GROWSIZE)
	{
		assert(nGrowSize>0);
		m_nGrowSize = nGrowSize;
	};
	void SetDataSize(int nDataSize)
	{
		assert(nDataSize<=m_nTotalSize && nDataSize>=0);
		m_nDataSize = nDataSize;
	};
	void Clear()
	{
		m_nDataSize = 0;
		if(m_nTotalSize>0) ZEROP(m_byData,m_nTotalSize);
	};
	BOOL TrimLeft(int nTrimSize)
	{
		assert(nTrimSize>=0);
		EXITON(m_nDataSize<nTrimSize,FALSE);
		m_nDataSize -= nTrimSize;
		if(m_nDataSize>0) memcpy(m_byData,m_byData+nTrimSize,m_nDataSize);
		return TRUE;
	};
	BOOL TrimRight(int nTrimSize)
	{
		assert(nTrimSize>=0);
		EXITONACT(m_nDataSize<=nTrimSize,TRUE,m_nDataSize=0);
		m_nDataSize -= nTrimSize;
		return TRUE;
	};
	BOOL TrimRightFrom(int nFromPos)
	{
		assert(nFromPos>=0);
		return TrimRight(m_nDataSize - nFromPos + 1);
	};
	BOOL TrimRange(int nFromPos,int nBeforePos)
	{
		assert(nFromPos>=0 && nBeforePos>=nFromPos);
		int nTrimSize = nBeforePos - nFromPos;
		EXITON(nTrimSize<=0,TRUE);
		EXITONACT(m_nDataSize<=nTrimSize,TRUE,m_nDataSize=0);
		m_nDataSize -= nTrimSize;
		if(m_nDataSize>nFromPos+1) memmove(m_byData+nFromPos,m_byData+nBeforePos,m_nDataSize-nFromPos-1);
		return TRUE;
	};
	BYTE* Detach(int *pnTotalSize,int *pnDataSize)
	{
		if(pnTotalSize) *pnTotalSize = m_nTotalSize;
		if(pnDataSize) *pnDataSize = m_nDataSize;
		BYTE *by = m_byData;
		m_byData = NULL;
		m_nTotalSize = 0;
		m_nDataSize = 0;
		return by;
	};
public:
	void Free()
	{
		if(m_byData) delete [] m_byData;
		m_byData = NULL;
		m_nTotalSize = 0;
		m_nDataSize = 0;
	};
	BOOL Grow(int nGrowSize)
	{
		assert(m_nTotalSize>=0 && m_nDataSize>=0 && m_nGrowSize>0);
		EXITON(nGrowSize<=0,TRUE);
		nGrowSize += m_nGrowSize - (nGrowSize % m_nGrowSize);
		BYTE *by = new BYTE[m_nTotalSize + nGrowSize];
		EXITON(by==NULL,FALSE);
		ZEROP(by,m_nTotalSize + nGrowSize);
		if(m_nDataSize>0 && m_byData) memcpy(by,m_byData,m_nDataSize);
		if(m_byData) delete [] m_byData;
		m_byData = by;
		m_nTotalSize += nGrowSize;
		return TRUE;
	};
	BOOL Alloc(int nTotalSize)
	{
		assert(nTotalSize>0);
		EXITON(m_nTotalSize>=nTotalSize,TRUE);
		Free();
		return Grow(nTotalSize);
	};
	void Attach(BYTE *byData,int nTotalSize,int nDataSize)
	{
		Free();
		m_byData = byData;
		m_nTotalSize = nTotalSize;
		m_nDataSize = nDataSize;
	};
	BOOL EnsureAlloced(int nTotalSize)
	{
		EXITON(m_nTotalSize>=nTotalSize,TRUE);
		return Grow(nTotalSize - m_nTotalSize);
	};
	BOOL TrimBlank()
	{
		EXITON(m_nTotalSize-m_nDataSize<m_nGrowSize || m_nTotalSize==0,TRUE);
		EXITONACT(m_nDataSize<=0,TRUE,Free());
		int nNeededSize = m_nDataSize;
		assert(m_nGrowSize>0);
		nNeededSize += m_nGrowSize - (m_nDataSize % m_nGrowSize);
		int nDataSize = m_nDataSize;
		int nTotalSize = m_nTotalSize;
		BYTE *by = m_byData;
		m_byData = NULL;
		m_nDataSize = 0;
		m_nTotalSize = 0;
		EXITONACT(Grow(nNeededSize)==FALSE,FALSE,ACT3(m_byData=by,m_nDataSize=nDataSize,m_nTotalSize=nTotalSize));
		if(nDataSize>0 && by) memcpy(m_byData,by,nDataSize);
		m_nDataSize = nDataSize;
		if(by) delete [] by;
		return TRUE;
	};
	BYTE& operator[](int nIdx)
	{
		ENSURE(EnsureAlloced(nIdx+1));
		return m_byData[nIdx];
	};
	BOOL Clone(LPCVOID pvData,int nDataSize)
	{
		Free();
		EXITON(pvData==NULL || nDataSize<=0 || Grow(nDataSize)==FALSE,FALSE);
		memcpy(m_byData,pvData,nDataSize);
		m_nDataSize = nDataSize;
		return TRUE;
	};
	BOOL Clone(LPCSTR strData)
	{
		EXITONACT(strData==NULL,TRUE,Free());
		return Clone((LPCVOID)strData,(int)strlen(strData));
	};
	ByteArray& operator=(LPCSTR strData){Clone(strData);return *this;};
	BOOL Clone(const ByteArray& a)
	{
		EXITONACT(a.m_nDataSize<=0,TRUE,Free());
		m_nGrowSize = a.m_nGrowSize;
		return Clone(a.m_byData,a.m_nDataSize);
	};
	ByteArray& operator=(const ByteArray& a){Clone(a);return *this;};
	BOOL Append(LPCVOID pvData,int nDataSize)
	{
		EXITON(pvData==NULL || nDataSize<=0,FALSE);
		EXITON(EnsureAlloced(m_nDataSize+nDataSize)==FALSE,FALSE);
		memcpy(m_byData+m_nDataSize,pvData,nDataSize);
		m_nDataSize += nDataSize;
		return TRUE;
	};
	BOOL Append(LPCSTR strData)
	{
		EXITON(strData==NULL,FALSE);
		return Append((LPCVOID)strData,(int)strlen(strData));
	};
	ByteArray& operator+=(LPCSTR strData){Append(strData);return *this;};
	ByteArray& operator+=(BYTE by){Append(&by,1);return *this;};
	ByteArray& operator+=(WORD w){Append(&w,2);return *this;};
	ByteArray& operator+=(DWORD dw){Append(&dw,4);return *this;};
	ByteArray& operator+=(char c){return *this+=(BYTE)c;};
	ByteArray& operator+=(short sn){return *this+=(WORD)sn;};
	ByteArray& operator+=(int n){return *this+=(DWORD)n;};
	ByteArray& operator+=(unsigned int un){return *this+=(DWORD)un;};
	BOOL ReplaceAt(int nIdx,BYTE by)
	{
		EXITON(nIdx<0 || m_nDataSize<nIdx,FALSE);
		if(m_nDataSize==nIdx)
		{
			EXITON(EnsureAlloced(m_nDataSize+1),FALSE);
			++m_nDataSize;
		}
		m_byData[nIdx] = by;
		return TRUE;
	};
	BOOL ReplaceAt(int nIdx,WORD w)
	{
		EXITON(nIdx<0 || m_nDataSize<nIdx,FALSE);
		if(m_nDataSize==nIdx)
		{
			EXITON(EnsureAlloced(m_nDataSize+2),FALSE);
			m_nDataSize = 2;
		}
		*((WORD *)(m_byData + nIdx)) = w;
		return TRUE;
	};
	BOOL ReplaceAt(int nIdx,DWORD dw)
	{
		EXITON(nIdx<0 || m_nDataSize<nIdx,FALSE);

⌨️ 快捷键说明

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