为Win32而生的C头文件.docx
《为Win32而生的C头文件.docx》由会员分享,可在线阅读,更多相关《为Win32而生的C头文件.docx(18页珍藏版)》请在冰豆网上搜索。
为Win32而生的C头文件
C/C++堆、链表、Win32下的TRACE宏、
不用多说,直接看源代码吧。
以下文件代码已编译通过,可在编程中使用。
Heap.h
#pragmaonce
//本文件含有类定义,不能重复包含本文件
//继承CHeap的类自动重载new与delete运算符,能快速释放堆,非常适合于链表
classCHeap
{
public:
LPVOIDoperatornew(size_t);
VOIDoperatordelete(LPVOID);
protected:
staticUINTsm_nCount;
staticHANDLEsm_hHeap;
};
inlineLPVOIDCHeap:
:
operatornew(size_tsize)
{
if(sm_nCount==0){
sm_hHeap=HeapCreate(0,0,0);
}
LPVOIDpClass=HeapAlloc(sm_hHeap,0,size);
if(pClass!
=NULL){
sm_nCount++;
returnpClass;
}
returnNULL;
}
inlineVOIDCHeap:
:
operatordelete(LPVOIDp)
{
HeapFree(sm_hHeap,0,p);
sm_nCount--;
if(sm_nCount==0){
HeapDestroy(sm_hHeap);
}
}
UINTCHeap:
:
sm_nCount=0;
HANDLECHeap:
:
sm_hHeap=NULL;
List.h
#pragmaonce
#include"Heap.h"
#include"CmnHdr.h"
//调用RemoveAll()将引用Heap.h全局变量
//此时本文件只能被包含一次
#defineEXCEPTION_ARRAY_OVERLOWMAKESOFTWAREEXCEPTION(3,FACILITY_NULL,1)//越界错误码
//请使用
//try{...}
//catch(DWORDdwExceptionCode){
//if(dwException==EXCEPTION_ARRAY_OVERLOW){
///*你的处理代码*/
//}
//捕获越界异常
//如果调用GetData(...,BOOLbThrowException)并为bThrowException传FALSE,越界将调用Debugbreak,在x86上将触发int3汇编指令
//警告:
GetData与operator[]函数越界检查功能基于只有一个链表对象存在,并且不存在其他CHeap对象或CHeap派生类的对象
//如果不符合以上情况,越界检查功能将不可用,此时请保证索引合法
//或是换用GetFirst()与GetNext()
//注意:
Remove()与RemoveAll()操作仅删除链表记录,不删除元素
//AddTo*函数仅是将元素在链表中增添记录
//若需删除元素(在内存中删除),请调用Empty*函数
//警告:
Empty*函数仅适用于使用new操作符申请的元素,将堆栈中的变量加入链表请勿调用该系列函数,否则将发生错误
//使用Empty*函数请确保一个元素是一个new操作,不能【通过new一个数组,并为数组每一个元素调用AddTo*】
//将C++类加入链表,如需特需操作(如不使用默认堆),请重载new与delete操作符
//Empty*函数注意事项较多,如不能保证以上任意一点,请勿调用Empty*函数
//Remove*与Empty*函数都依据TYPE指针值查找元素(即同一个变量【内容相同的不同变量不会混淆】),这样可以定位到唯一的元素。
//GetCount()函数将返回继承自CHeap的类调用(operatornew的次数-调用operatordelete的次数),不一定是链表元素个数
//GetData()与operator[]函数需要通过遍历链表来查找元素,如需遍历链表,请换用GetFirst()与GetNext()
template
classCList:
publicCHeap
{
protected:
struct_structObject{
TYPE*m_pObject;
_structObject*m_previous;
_structObject*m_Next;
};
_structObject*m_Head;
_structObject*m_End;
private:
_structObject*m_pCurrent;
BOOLm_PrintFromHead;
public:
CList();
~CList();
BOOLAddToHead(TYPE*pObject);
BOOLAddToEnd(TYPE*pObject);
BOOLRemove(TYPE*pObject);
TYPE*GetFirst(BOOLbFromHead=TRUE);
TYPE*GetNext();
TYPE&GetData(UINTpos,BOOLbFromHead=TRUE,BOOLbThrowException=TRUE);
TYPE&operator[](UINT);
UINTGetCount(){returnsm_nCount;}
VOIDRemoveAll();
VOIDEmptyList();
BOOLEmptyNode(TYPE*pObject);
};
template
CList:
:
CList()
{
m_Head=NULL;
m_End=NULL;
m_pCurrent=NULL;
m_PrintFromHead=TRUE;
}
template
CList:
:
~CList()
{
RemoveAll();
}
template
BOOLCList:
:
AddToHead(TYPE*pObject)
{
_structObject*p=(_structObject*)operatornew(sizeof(_structObject));
p->m_pObject=pObject;
if(m_Head==NULL){//第一个元素
m_End=p;
m_Head=p;
p->m_previous=NULL;
p->m_Next=NULL;
returnTRUE;
}
m_Head->m_previous=p;
p->m_Next=m_Head;
p->m_previous=NULL;
m_Head=p;
returnTRUE;
}
template
BOOLCList:
:
AddToEnd(TYPE*pObject)
{
_structObject*p=(_structObject*)operatornew(sizeof(_structObject));
p->m_pObject=pObject;
if(m_End==NULL){//第一个元素
m_Head=p;
m_End=p;
p->m_previous=NULL;
p->m_Next=NULL;
returnTRUE;
}
m_End->m_Next=p;
p->m_previous=m_End;
m_End=p;
p->m_Next=NULL;
returnTRUE;
}
template
VOIDCList:
:
RemoveAll()
{
_structObject*pCurrent=m_Head;
_structObject*pTemp=NULL;
while(pCurrent!
=NULL){
pTemp=pCurrent->m_Next;
operatordelete(pCurrent);
pCurrent=pTemp;
}
m_Head=m_End=NULL;
m_pCurrent=NULL;
}
template
TYPE&CList:
:
GetData(UINTpos,BOOLFromHead,BOOLbThrowException)
{
_structObject*p=NULL;
if(pos>sm_nCount){
switch(bThrowException)
{
caseTRUE:
throwEXCEPTION_ARRAY_OVERLOW;
break;
caseFALSE:
DebugBreak();//若不检查返回值,有可能导致失败
break;
}
}
if(FromHead){
p=m_Head;
for(;pos;pos--){
p=p->m_Next;
}
}
else{
p=m_End;
for(;pos;pos--){
p=p->m_previous;
}
}
return*(p->m_pObject);
}
template
TYPE&CList:
:
operator[](UINTpos)
{
returnGetData(pos,TRUE,TRUE);
}
template
BOOLCList:
:
Remove(TYPE*pObject)
{
for(_structObject*p=m_Head;p!
=NULL;p=p->m_Next){
if(p->m_pObject==pObject){
if(p==m_Head&&p==m_End){//只有一个元素的链表
RemoveAll();
returnTRUE;
}
elseif(p==m_Head){
p->m_Next->m_previous=NULL;
m_Head=p->m_Next;
}
elseif(p==m_End){
p->m_previous->m_Next=NULL;
m_End=p->m_previous;
}
else{
p->m_previous->m_Next=p->m_Next;
p->m_Next->m_previous=p->m_previous;
}
operatordelete(p);
returnTRUE;
}
}
returnFALSE;
}
template
TYPE*CList:
:
GetFirst(BOOLbFromHead)
{
if(m_Head==NULL&&m_End==NULL){
returnNULL;
}
if(bFromHead){//从头遍历
m_PrintFromHead=TRUE;
m_pCurrent=m_Head;
returnm_Head->m_pObject;
}
//从末尾遍历
m_PrintFromHead=FALSE;
m_pCurrent=m_End;
returnm_End->m_pObject;
}
template
TYPE*CList:
:
GetNext()
{
if(m_Head==NULL&&m_End==NULL){//空链表
returnNULL;
}
if(m_PrintFromHead){
m_pCurrent=m_pCurrent->m_Next;
}
else{
m_pCurrent=m_pCurrent->m_previous;
}
if(m_pCurrent==NULL){
returnNULL;
}
returnm_pCurrent->m_pObject;
}
template
VOIDCList:
:
EmptyList()
{
for(_structObject*p=m_Head;p!
=NULL;p=p->m_Next){
deletep->m_pObject;
p->m_pObject=NULL;
}
RemoveAll();
}
template
BOOLCList:
:
EmptyNode(TYPE*pObject)
{
for(TYPE*p=GetFirst();p!
=NULL;p=GetNext()){
if(p==pObject){
Remove(p);
deletep;
returnTRUE;
}
}
returnFALSE;
}
Win32Trace.h
#pragmaonce
//本头文件含有函数定义,只能包含本头文件一次
#defineMAX_CCH_STRING_SIZE1024//自定义最大输出字符串长度
#ifdef_DEBUG
#defineTRACEDebugTrace
#else
#defineReleaseTRACE(LPCTSTR,...)
#defineTRACEReleaseTRACE
#endif
LPTSTRszDebugString=(LPTSTR)VirtualAlloc(NULL,MAX_CCH_STRING_SIZE*sizeof(TCHAR),
MEM_RESERVE|MEM_TOP_DOWN|MEM_COMMIT,
PAGE_READWRITE);
VOID_stdcallDebugTrace(LPCTSTRszTrace,...)
{
va_listvalist;
va_start(valist,szTrace);
_vstprintf(szDebugString,MAX_CCH_STRING_SIZE,szTrace,valist);
va_end(valist);
OutputDebugString(szDebugString);
}
CmnHdr.h//此文件《Windows核心编程》
/******************************************************************************
Module:
CmnHdr.h
Notices:
Copyright(c)2008JeffreyRichter&ChristopheNasarre
Purpose:
Commonheaderfilecontaininghandymacrosanddefinitions
usedthroughoutalltheapplicationsinthebook.
SeeAppendixA.
******************************************************************************/
#pragmaonce//Includethisheaderfileoncepercompilationunit
////////////////////////WindowsVersionBuildOption/////////////////////////
//自动生成的项目已定义
//=0x0600forVISTAlevelfromsdkddkver.h
//#define_WIN32_WINNT_WIN32_WINNT_LONGHORN
//#defineWINVER_WIN32_WINNT_LONGHORN
////////////////////////////UnicodeBuildOption/////////////////////////////
//AlwayscompilerusingUnicode.
#ifndefUNICODE
#defineUNICODE
#endif
//WhenusingUnicodeWindowsfunctions,useUnicodeC-Runtimefunctionstoo.
#ifdefUNICODE
#ifndef_UNICODE
#define_UNICODE
#endif
#endif
/////////////////////////IncludeWindowsDefinitions/////////////////////////
#pragmawarning(push,3)
#include
#pragmawarning(pop)
#pragmawarning(push,4)
#include
#include//For_beginthreadex
/////////////Verifythattheproperheaderfilesarebeingused//////////////
#ifndefFILE_SKIP_COMPLETION_PORT_ON_SUCCESS
#pragmamessage("YouarenotusingthelatestPlatformSDKheader/library")
#pragmamessage("files.Thismaypreventtheprojectfrombuildingcorrectly.")
#endif
//////////////Allowcodetocompilecleanlyatwarninglevel4///////////////
/*nonstandardextension'singlelinecomment'wasused*/
#pragmawarning(disable:
4001)
//unreferencedformalparameter
#pragmawarning(disable:
4100)
//Note:
Creatingprecompiledheader
#pragmawarning(disable:
4699)
//functionnotinlined
#pragmawarning(disable:
4710)
//unreferencedinlinefunctionhasbeenremoved
#pragmawarning(disable:
4514)
//assignmentoperatorcouldnotbegenerated
#pragmawarning(disable:
4512)
//conversionfrom'LONGLONG'to'ULONGLONG',signed/unsignedmismatch
#pragmawarning(disable:
4245)
//'typecast':
conversionfrom'LONG'to'HINSTANCE'ofgreatersize
#pragmawarning(disable:
4312)
//'argument':
conversionfrom'LPARAM'to'LONG',possiblelossofdata
#pragmawarning(disable:
4244)
//'wsprintf':
namewasmarkedas#pragmadeprecated
#pragmawarning(disable:
4995)
//unaryminusoperatorappliedtounsignedtype,resultstillunsigned
#pragmawarning(disable:
4146)
//'argument':
conversionfrom'size_t'to'int',possiblelossofdata
#pragmawarning(disable:
4267)
//nonstandardextensionused:
namelessstruct/union
#pragmawarning(disable:
4201)
/////////////////////////Pragmamessagehelpermacro/////////////////////////
/*
Whenthecompilerseesalinelikethis:
#pragmachMSG(Fixthislater)
itoutputsalinelikethis:
c:
\CD\CmnHdr.h(82):
Fixthislater
Youcaneasilyjumpdirectlytothislineandexaminethesurroundingcode.
*/
#definechSTR2(x)#x
#definechSTR(x)chSTR2(x)
#definechMSG(desc)message(__FILE__"("chSTR(__LINE__)"):
"#desc)
//////////////////////////////chINRANGEMacro////////////////////////////////
//ThismacroreturnsTRUEifanumberisbetweentwoothers
#definechINRANGE(low,Num,High)(((low)<=(Num))&&((