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