www.pudn.com > OutputoracleDBStruct2XML.rar > Tinyhelp.h


#ifndef TINY_HELP_H 
#define TINY_HELP_H 
 
#include  
 
//========================== 
//为使代码简洁而使用的一些宏 
//========================== 
 
//等于某值时返回 
/* 
if(ptr == NULL) 
{ 
return; 
} 
=> 
RETURN(ptr,NULL) 
 
*/ 
 
/*得到原始数组的长度*/ 
#define COUNTOF(x) (sizeof(x) / sizeof(x[0])) 
 
//指针为空时返回 
#define NULL_RETURN(ptr)\ 
	if (ptr ==NULL)	{\ 
	return;\ 
	} 
	 
//指针为空时返回指定值 
#define NULL_RETURN_EX(ptr,rlt)\ 
	if (ptr ==NULL)	{\ 
	return rlt;\ 
	} 
 
#define RETURN(T)\ 
	if (T)	{\ 
	return ;\ 
	} 
 
#define RETURN_EX(T,rlt)\ 
	if (T)	{\ 
	return rlt;\ 
	} 
 
//是否为有效的variant类型 
inline bool ValidateVariant(_variant_t & var) 
{ 
	if(var.vt==VT_EMPTY ||var.vt==VT_NULL) 
		return false; 
	else 
		return true;	 
} 
 
//是否为有效的CString类型 
inline bool ValidateString(CString & str) 
{ 
	if (str.Trim().IsEmpty())	 
		return false;	 
	else	 
		return true;	 
} 
 
inline BOOL V2S(const _variant_t &vtValue,CString &sRet) 
{ 
	sRet = _T(""); 
 
	if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY)) 
	{ 
		sRet = (LPCTSTR)(_bstr_t)vtValue; 
		return TRUE; 
	} 
 
	return FALSE; 
} 
 
inline CString V2S(const _variant_t &var) 
{ 
	CString sInfo =  _T("");	 
 
	switch(var.vt)    
	{    
	case VT_I2: 
		sInfo.Format(_T("%d"),V_I2(&var)); 
		break;		//短整型   
	case VT_I4: 
		sInfo.Format(_T("%ld"),V_I4(&var)); 
		break;		//长整型  
	case VT_R4:		//浮点型  
	case VT_R8:		//双精度型  
		sInfo.Format(_T("%f"),V_R8(&var)); 
		break;   
	case VT_BSTR:	//字符型 
		sInfo = (LPCTSTR)(_bstr_t)var; 
		break; 
#ifdef ___ATLCOMTIME_H__ 
	case VT_DATE: 
		{ 
			COleDateTime time = var; 
			sInfo.Format("%d-%d-%d",time.GetYear(),time.GetMonth(),time.GetDay()); 
		} 
		break; 
#endif 
	 
	default:break;    
	}  
 
	return sInfo; 
} 
 
inline  DOUBLE V2D(_variant_t vtValue) 
{ 
	DOUBLE dRet = 0.00; 
 
	if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY)) 
	{ 
		try 
		{ 
			dRet = (DOUBLE)vtValue; 
		} 
		catch (_com_error &e) 
		{ 
			ATLTRACE("\nV2D::%s\n",(LPCTSTR)e.Description()); 
		}		 
	} 
 
	return dRet; 
} 
 
inline  BOOL V2L(_variant_t vtValue,LONG &lRet) 
{ 
	lRet = -1; 
 
	if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY)) 
	{ 
		try 
		{ 
			lRet = (LONG)vtValue; 
		} 
		catch (_com_error &e) 
		{ 
			ATLTRACE("\nV2L::%s\n",(LPCTSTR)e.Description()); 
		} 
 
		return TRUE; 
	} 
 
	return FALSE;	 
} 
 
inline  long V2L(_variant_t vtValue) 
{ 
	long lRet = -1; 
	 
	if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY)) 
	{ 
		try 
		{ 
			lRet = (LONG)vtValue; 
		} 
		catch (_com_error &e) 
		{ 
			ATLTRACE("\nV2L::%s\n",(LPCTSTR)e.Description()); 
		}		 
	} 
 
	return lRet;	 
} 
 
#if defined(_WINDOWS_) && defined(__cplusplus)  
 
//ATL中使用的等待光标 
inline void ATLBeginWaitCursor(void) { 
	HCURSOR cur = reinterpret_cast< HCURSOR >(::LoadCursor( NULL, MAKEINTRESOURCE( IDC_WAIT ) )); 
	if ( NULL == cur ) { 
		assert( FALSE && _T("Call BeginWaitCursor Failed") );		 
	} 
 
	HCURSOR hSetOK = ::SetCursor( cur );	 
} 
 
inline void ATLEndWaitCursor(void) { 
	HCURSOR cur = reinterpret_cast< HCURSOR >(::LoadCursor( NULL, MAKEINTRESOURCE( IDC_ARROW ) )); 
	if ( NULL == cur ) { 
		assert( FALSE && _T("Call EndWaitCursor Failed "));		 
	} 
 
	::DestroyCursor( ::SetCursor( cur ) );	 
} 
 
class CATLWaitCursor 
{ 
public: 
	CATLWaitCursor(){ATLBeginWaitCursor();} 
	~CATLWaitCursor(){ATLEndWaitCursor();} 
}; 
 
#ifdef _DEBUG 
#define TRY_AT_DEBUG() \ 
    try { 
 
#define CATCH_COM_ERROR_AT_DEBUG(msg_header, notify) \ 
}\ 
    catch (_com_error & err) {\ 
    _bstr_t a = err.Description();\ 
    _bstr_t b = err.ErrorMessage();\ 
    TCHAR buf[BUFSIZ] = _T("");\ 
    _stprintf(buf, _T("\r\n%s!! Error Description = [%s] ; \r\nError Message = [%s]"), (msg_header),(const TCHAR *)a, (const TCHAR *)b);\ 
    OutputDebugString(buf);\ 
    \ 
    if ((notify))\ 
    {\ 
        TCHAR * msg = buf;\ 
        ::MessageBox(0, buf, _T("something wrong!~"), MB_OK);\ 
    }\ 
}\ 
 
#else 
#define  TRY_AT_DEBUG() 
#define  CATCH_COM_ERROR_AT_DEBUG(msg_header, notify) 
#endif 
 
 
#endif 
 
#endif