为Win32而生的C头文件.docx

上传人:b****7 文档编号:8937235 上传时间:2023-02-02 格式:DOCX 页数:18 大小:21.84KB
下载 相关 举报
为Win32而生的C头文件.docx_第1页
第1页 / 共18页
为Win32而生的C头文件.docx_第2页
第2页 / 共18页
为Win32而生的C头文件.docx_第3页
第3页 / 共18页
为Win32而生的C头文件.docx_第4页
第4页 / 共18页
为Win32而生的C头文件.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

为Win32而生的C头文件.docx

《为Win32而生的C头文件.docx》由会员分享,可在线阅读,更多相关《为Win32而生的C头文件.docx(18页珍藏版)》请在冰豆网上搜索。

为Win32而生的C头文件.docx

为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))&&((

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1