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

📄 univar.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// UniVar.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include <afxdllx.h>
#include "UniVar.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

static AFX_EXTENSION_MODULE UniVarDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	// Remove this if you use lpReserved
	UNREFERENCED_PARAMETER(lpReserved);

	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("UNIVAR.DLL Initializing!\n");
		
		// Extension DLL one-time initialization
		if (!AfxInitExtensionModule(UniVarDLL, hInstance))
			return 0;

		// Insert this DLL into the resource chain
		// NOTE: If this Extension DLL is being implicitly linked to by
		//  an MFC Regular DLL (such as an ActiveX Control)
		//  instead of an MFC application, then you will want to
		//  remove this line from DllMain and put it in a separate
		//  function exported from this Extension DLL.  The Regular DLL
		//  that uses this Extension DLL should then explicitly call that
		//  function to initialize this Extension DLL.  Otherwise,
		//  the CDynLinkLibrary object will not be attached to the
		//  Regular DLL's resource chain, and serious problems will
		//  result.

		new CDynLinkLibrary(UniVarDLL);
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("UNIVAR.DLL Terminating!\n");
		// Terminate the library before destructors are called
		AfxTermExtensionModule(UniVarDLL);
	}
	return 1;   // ok
}

AFX_EXT_DATA UniVar UniVar::m_InValidValue=UniVar(DATA_TYPE_MAX+1,DATA_TYPE_MAX+1);
HANDLE UniVar::m_hCreate=NULL;
int UniVar::m_iHeapBlock=0;
UniVar TempVar("i love you");

inline void UniVar::ClearData()
{
	try{
		UniDelete();
	}
	catch(...){	
	}
};

void UniVar::UniDelete()
{
	if(it==DATA_TYPE_STRING||it==DATA_TYPE_HANDLE){
		if(dwCheckL&&uv.heap.handle&&UniVar::m_hCreate&&uv.heap.handle==uv.heap.pBuffer){
			HANDLE hdl=uv.heap.handle;
			uv.heap.handle=uv.heap.pBuffer=0;
			dwCheckL=0;
			if(HeapValidate(UniVar::m_hCreate,0,hdl)){
				if(HeapFree(UniVar::m_hCreate,0,hdl)){
					UniVar::m_iHeapBlock--;
					if(!UniVar::m_iHeapBlock){
						HANDLE pp=UniVar::m_hCreate;
						UniVar::m_hCreate=NULL;
						HeapDestroy(pp);
					}
				}
			}
			return;
		}
	}
	uv.heap.handle=uv.heap.pBuffer=0;
	dwCheckL=0;
}

void UniVar::Uninew(int size,int ite)
{
	if(ite==DATA_TYPE_STRING||ite==DATA_TYPE_HANDLE){
		ASSERT(size);
		it=ite;
		if(!UniVar::m_hCreate){
			UniVar::m_hCreate=HeapCreate(0,0,0);
			if(!UniVar::m_hCreate)return;
		}
		try{
			uv.heap.pBuffer=HeapAlloc(UniVar::m_hCreate,0,size);
		}
		catch(...){
			uv.heap.pBuffer=0;
		}
		if(uv.heap.pBuffer){
			uv.heap.handle=uv.heap.pBuffer;
			SetDataLength(size);
			UniVar::m_iHeapBlock++;
		}
		else{
			uv.heap.handle=NULL;
			SetDataLength(0);
		}
		return;
	}
	else{
		uv.heap.handle=uv.heap.pBuffer=0;
		it=ite;
	}
};

char * UniVar::NewBlock(int isize)
{
	if(isize>0){
		if(!UniVar::m_hCreate){
			UniVar::m_hCreate=HeapCreate(0,0,0);
			if(!UniVar::m_hCreate)return NULL;
		}
		return (char *)HeapAlloc(UniVar::m_hCreate,0,isize);
	}
	return NULL;
}

BOOL UniVar::DeleteBlock(void * p)
{
	if(HeapValidate(UniVar::m_hCreate,0,p)){
		if(HeapFree(UniVar::m_hCreate,0,p)){
			return TRUE;
		}
	}
	return FALSE;
}

void UniVar::SetData(PARAMEMTER * pm,UniVar & tv)
{
	if(pm->tv.it==DATA_TYPE_HANDLE){
		if(!pm->tv.GetDataLength()){
			*this=tv;
		}
		else{
			ClearData();
			int j=pm->tv.GetDataLength();
			Uninew(j,DATA_TYPE_HANDLE);
			if(tv.GetDataLength()==j){
				if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
			}
			else{
				if(uv.bv)memset(uv.bv,0,j);
			}
		}
	}
	else if(pm->tv.it==tv.it)*this=tv;
	else {
		switch(pm->tv.it){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		}
	}
};

void UniVar::SetData(int itp,int ilenp,UniVar & tv)
{
	if(itp==DATA_TYPE_HANDLE){
		if(!ilenp){
			*this=tv;
		}
		else{
			ClearData();
			int j=ilenp;
			Uninew(j,DATA_TYPE_HANDLE);
			if(tv.GetDataLength()==j){
				if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
			}
			else {
				if(uv.bv)memset(uv.bv,0,j);
			}
		}
	}
	else if(itp==tv.it)*this=tv;
	else {
		switch(itp){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		}
	}
}

UniVar::UniVar(int itp,int ilenp,UniVar & tv)
{
	if(itp==DATA_TYPE_HANDLE){
		if(!ilenp){
			*this=tv;
		}
		else{
			int j=ilenp;
			Uninew(j,DATA_TYPE_HANDLE);
			if(tv.GetDataLength()==j){
				if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
			}
			else {
				if(uv.bv)memset(uv.bv,0,j);
			}
		}
	}
	else if(itp==tv.it){
		if(tv.GetDataLength()){
			Uninew(tv.GetDataLength(),tv.it);
			if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
		}
		else {
			memcpy(this,&tv,sizeof(UniVar));
		};
	}
	else {
		memset(this,0,sizeof(UniVar));
		switch(itp){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		}
	}
}

UniVar::UniVar(PARAMEMTER * pm,UniVar & tv)
{
	if(pm->tv.it==DATA_TYPE_HANDLE){
		if(!pm->tv.GetDataLength()){
			*this=tv;
		}
		else{
			int j=pm->tv.GetDataLength();
			Uninew(j,DATA_TYPE_HANDLE);
			if(tv.GetDataLength()==j){
				if(uv.bv)memcpy(uv.bv,tv.uv.cv,j);
			}
			else {
				if(uv.bv)memset(uv.bv,0,j);
			}
		}
	}
	else if(pm->tv.it==tv.it){
		if(tv.GetDataLength()){
			Uninew(tv.GetDataLength(),tv.it);
			if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
		}
		else {
			memcpy(this,&tv,sizeof(UniVar));
		};
	}
	else {
		memset(this,0,sizeof(UniVar));
		switch(pm->tv.it){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		}
	}
};
//clanguage@163.net
//21cn.com
UniVar Calculate(const UniVar & tv3,const UniVar & tv4,int iFlag)
{
	UniVar tv1;
	UniVar tv2;
	tv1=tv3;
	tv2=tv4;

	if(tv2.it>=DATA_TYPE_HANDLE||tv2.it<DATA_TYPE_INT)tv2=(0);
	if(tv1.it>=DATA_TYPE_HANDLE||tv1.it<DATA_TYPE_INT)tv1=(0);
	if(tv1.it!=tv2.it){
		if(tv2.it==DATA_TYPE_STRING)tv2=(0);
		if(tv1.it==DATA_TYPE_STRING)tv1=(0);
		if(tv1.it==DATA_TYPE_FLOAT){
			if(tv2.it==DATA_TYPE_INT)
				tv2=((double)tv2.uv.iv);
			else
				tv2=((double)tv2.uv.pv);
		}
		else if(tv2.it==DATA_TYPE_FLOAT){
			if(tv1.it==DATA_TYPE_INT)
				tv1=((double)tv1.uv.iv);
			else
				tv1=((double)tv1.uv.pv);
		}
		else if(tv1.it==DATA_TYPE_DWORD){
			tv2=((DWORD)tv2.uv.iv);
		}
		else {
			tv1=((DWORD)tv1.uv.iv);
		}
	}
	if(iFlag>1&&iFlag<8){
		if(tv2.it==DATA_TYPE_STRING)tv2=(0);
		if(tv1.it==DATA_TYPE_STRING)tv1=(0);
	}
	if(iFlag>4&&iFlag<8){
		if(tv2.it==DATA_TYPE_STRING)tv2=((int)tv2.uv.dv);
		if(tv1.it==DATA_TYPE_STRING)tv1=((int)tv1.uv.dv);
	}
	switch(iFlag){
	case 0://+
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv+=tv2.uv.iv;
			break;
		case DATA_TYPE_FLOAT:
			tv1.uv.dv+=tv2.uv.dv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv+=tv2.uv.pv;
			break;
		case DATA_TYPE_STRING:
			{
			CString cs=tv1.uv.cv;
			cs+=tv2.uv.cv;
			tv1=(LPSTR)(LPCTSTR)cs;
			break;
			}
		}
		break;
	case 1://-
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv-=tv2.uv.iv;
			break;
		case DATA_TYPE_FLOAT:
			tv1.uv.dv-=tv2.uv.dv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv-=tv2.uv.pv;
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv1.uv.cv,tv1.uv.cv));
			break;
		};
		break;
	case 2://*
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv*=tv2.uv.iv;
			break;
		case DATA_TYPE_FLOAT:
			tv1.uv.dv*=tv2.uv.dv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv*=tv2.uv.pv;
			break;
		};
		break;
	case 3:// /
		switch(tv1.it){
		case DATA_TYPE_INT:
			if(tv2.uv.iv)
				tv1.uv.iv/=tv2.uv.iv;
			else
				tv1.uv.iv=0;
			break;
		case DATA_TYPE_FLOAT:
			if(tv2.uv.dv)
				tv1.uv.dv/=tv2.uv.dv;
			else
				tv1.uv.dv=0.0f;
			break;
		case DATA_TYPE_DWORD:
			if(tv2.uv.pv)
				tv1.uv.pv/=tv2.uv.pv;
			else
				tv1.uv.pv=0;
			break;
		};
		break;
	case 4://%
		switch(tv1.it){
		case DATA_TYPE_INT:
			if(tv2.uv.iv)
				tv1.uv.iv%=tv2.uv.iv;
			else 
				tv1.uv.iv=0;
			break;
		case DATA_TYPE_FLOAT:
			tv1.uv.dv=0.0f;
			break;
		case DATA_TYPE_DWORD:
			if(tv2.uv.pv)
				tv1.uv.pv%=tv2.uv.pv;
			else
				tv1.uv.pv=0;
			break;
		};
		break;
	case 5://^
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv^=tv2.uv.iv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv^=tv2.uv.pv;
			break;
		};
		break;
	case 6://&
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv&=tv2.uv.iv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv&=tv2.uv.pv;
			break;
		};
		break;
	case 7://|
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1.uv.iv|=tv2.uv.iv;
			break;
		case DATA_TYPE_DWORD:
			tv1.uv.pv|=tv2.uv.pv;
			break;
		};
		break;
	case 8://&&
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv&&tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv&&tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv&&tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(tv2.uv.cv&&tv1.uv.cv);
			break;
		};
		break;
	case 9://||
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv||tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv||tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv||tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(tv2.uv.cv||tv1.uv.cv);
			break;
		};
		break;
	case 10://>
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv>tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv>tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv>tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)>0);
			break;
		};
		break;
	case 11://>=
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv>=tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv>=tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv>=tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)>=0);
			break;
		};
		break;
	case 12://==
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv==tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv==tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv==tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv2.uv.cv,tv1.uv.cv)==0);
			break;
		};
		break;
	case 13://!=
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv!=tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv!=tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv!=tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv2.uv.cv,tv1.uv.cv)!=0);
			break;
		};
		break;
	case 14://<=
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv<=tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv<=tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv<=tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)<=0);
			break;
		};
		break;
	case 15://<
		switch(tv1.it){
		case DATA_TYPE_INT:
			tv1=(tv1.uv.iv<tv2.uv.iv);
			break;
		case DATA_TYPE_FLOAT:
			tv1=(tv1.uv.dv<tv2.uv.dv);
			break;
		case DATA_TYPE_DWORD:
			tv1=(tv2.uv.pv<tv1.uv.pv);
			break;
		case DATA_TYPE_STRING:
			tv1=(strcmp(tv1.uv.cv,tv2.uv.cv)<0);
			break;
		};
		break;
	default:
		tv1=(0);
		break;
	};

	return tv1;

}

UniVar operator +(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,0);
}

UniVar operator -(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,1);
}

UniVar operator *(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,2);
}

UniVar operator /(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,3);
}

UniVar operator %(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,4);
}

UniVar operator ^(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,5);
}

UniVar operator |(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,6);
}

UniVar operator &(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,7);
}

UniVar operator &&(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,8);
}

UniVar operator ||(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,9);
}

UniVar operator >(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,10);
}

UniVar operator >=(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,11);
}

UniVar operator ==(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,12);
}

UniVar operator !=(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,13);
}

UniVar operator <=(const UniVar & tv1,const UniVar & tv2)

⌨️ 快捷键说明

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