一个简单的Convert类的实现(VC++)

本文介绍了作者为VC++编写的类似.NET Convert类的一个简单类型转换类,包括浮点数、字节、空值和缓冲区的转换,并带有基本的异常处理。作者欢迎反馈和建议,以完善这个开源工具类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 下载地址: 本地下载

     近半年来又开始用VC++了.虽然不再像刚开始学VC那会对各种类型和宏很眼晕,但类型转换的时候也感觉很不舒服,于是仿照.NET的Convert类.写了这样一个简单的类型转换类.并加上了一点简单的异常处理.本人水平有限,希望老鸟们不要笑话我,并且能不吝指正我错误的地方.另外.这个类是我刚写完的.还没有进行完整的测试.也请大家帮我测测. 并帮我添加一下我没有想到的成员函数,然后联系我.我再把大家的想法发上来.最终.我想做出一个开源的,对大家项目都有帮助的类型转换类.

   如下.这是GFX_Convert.h文件.(GFX,是我的字句缩写.为区别别的类名的前缀.也给自己点纪念^_^)

其中,ToCharPointer 和 ToBSTR 函数的结果.请调用FreeCharPointer 和 FreeBSTR来进行释放.否则,会造成内存泄露.

 


#pragma  once

#include 
" GFX_ConvertException.h "



class  GFX_Convert
{
public :
    GFX_Convert(){}
    
~ GFX_Convert(){}
    
    
static  CTime ToCTime(LPCTSTR value);
    
static  CTime ToCTime(BYTE *  value);
    
static  CTime ToCTime(CString value);
    
static  CTime ToCTime(BSTR value);

    
static   int  ToInt(LPCTSTR value);
    
static   int  ToInt(BYTE *  value);
    
static   int  ToInt(CString value);
    
static   int  ToInt(BSTR value);

    
static   float  ToFloat(LPCTSTR value);
    
static   float  ToFloat(BYTE *  value);
    
static   float  ToFloat(CString value);
    
static   float  ToFloat(BSTR value);

    
static   double  ToDouble(LPCTSTR value);
    
static   double  ToDouble(BYTE *  value);
    
static   double  ToDouble(CString value);
    
static   double  ToDouble(BSTR value);

    
static  CString ToCString(LPCTSTR value);
    
static  CString ToCString( int  value);
    
static  CString ToCString( float  value);
    
static  CString ToCString( double  value);
    
static  CString ToCString(BSTR value);
    
static  CString ToCString(CTime value);
    
static  CString ToCString(LPCWSTR value);

    
/*  ToWideChar(LPWSTR) Must be used  */
    
static  LPWSTR ToWideChar(CString value);
    
static  LPWSTR ToWideChar(BSTR value);
    
static  LPWSTR ToWideChar(LPCTSTR value);
    
static  BOOL FreeWideChar(LPWSTR value);

    
/*  FreeCharPointer(LPCTSTR) Must be used  */
    
static  LPTSTR ToCharPointer(CString value);
    
static  LPTSTR ToCharPointer( int  value);
    
static  LPTSTR ToCharPointer( float  value);
    
static  LPTSTR ToCharPointer( double  value);
    
static  LPTSTR ToCharPointer(BSTR value);
    
static  BOOL FreeCharPointer(LPTSTR value);

    
/*  FreeBSTR(BSTR) Must be used  */
    
static  BSTR ToBSTR(CString value);
    
static  BSTR ToBSTR( int  value);
    
static  BSTR ToBSTR( float  value);
    
static  BSTR ToBSTR( double  value);
    
static  BSTR ToBSTR(LPCTSTR value);
    
static  BOOL FreeBSTR(BSTR value);

private :
    
static   void  ThrowException(CString csError);
};

 

 如下是.GFX_Convert.cpp.实现文件.

 


#include 
" StdAfx.h "
#include 
" GFX_Convert.h "
#include 
" GFX_ConvertException.h "

/*  To CTime begin */
CTime GFX_Convert::ToCTime(BYTE
*  value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" CTime ToCTime(BYTE* value): value is NULL! " ));
        
return   0 ;
    }

    DWORD   dwValue 
=   0 ;  
    
try {
        memcpy(
& dwValue,value, sizeof (DWORD));
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" CTime ToCTime(BYTE* value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }

    
return  CTime(dwValue);
}
CTime GFX_Convert::ToCTime(CString value)
{
    CTime cRet 
=  ToCTime(value.GetBuffer(value.GetLength()));
    value.ReleaseBuffer();

    
return  cRet;
}
CTime GFX_Convert::ToCTime(LPCTSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" CTime GFX_Convert::StringToCTime(LPCTSTR value): value is NULL! " ));
        
return   0 ;
    }

    CTime ctReT 
=   0 ;
    
try {
        CTime ctReT 
=  CTime::GetCurrentTime();

        CString csTime;
        csTime.Format(_T(
" %s " ),value);

        COleDateTime   dtTime;   
        dtTime.ParseDateTime(csTime);   
        
        SYSTEMTIME st;   
        dtTime.GetAsSystemTime(st);   
        CTime  tTime(st); 
        ctReT 
=  tTime;
    }
    
catch (...){
        CString csError; 
        csError.Format(_T(
" CTime GFX_Convert::StringToCTime(LPCTSTR value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }
    
return  ctReT;
}
CTime GFX_Convert::ToCTime(BSTR value)
{
    
return  ToCTime(ToCString(value));
}
/*  To CTime begin */


/*  To Int begin */
int  GFX_Convert::ToInt(BYTE *  value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" int GFX_Convert::ToInt(BYTE* value): value is NULL! " ));
        
return   0 ;
    }

    
int    nValue  =   0 ;  
    
try {
        memcpy(
& nValue,value, sizeof ( int ));
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" int GFX_Convert::ToInt(BYTE* value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }

    
return  nValue;
}
int  GFX_Convert::ToInt(CString value)
{
    
int  nRet  =  ToInt(value.GetBuffer(value.GetLength()));
    value.ReleaseBuffer();

    
return  nRet;
}
int  GFX_Convert::ToInt(LPCTSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" int GFX_Convert::StringToInt(LPCTSTR value): value is NULL! " ));
        
return   0 ;
    }
    
    
int  nRei  = 0 ;
    
try {
        nRei 
=  atoi(value);
    }
    
catch (...){
        CString csError; 
        csError.Format(_T(
" int GFX_Convert::StringToInt(LPCTSTR value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }
    
    
return  nRei;
}
/*  To Int end */

/*  To Float begin */
float  GFX_Convert::ToFloat(LPCTSTR value)
{
    
return  ( float )ToDouble(value);
}
float  GFX_Convert::ToFloat(BYTE *  value)
{
    
return  ( float )ToDouble(value);
}
float  GFX_Convert::ToFloat(CString value)
{
    
return  ( float )ToDouble(value);
}
/*  To Float end */

/*  To Double begin */
double  GFX_Convert::ToDouble(BYTE *  value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" float ToFloat(BYTE* value): value is NULL! " ));
        
return   0 ;
    }

    
double    fValue  =   0.0f ;  
    
try {
        memcpy(
& fValue,value, sizeof ( float ));
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" float ToFloat(BYTE* value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }

    
return  fValue;
}
double  GFX_Convert::ToDouble(CString value)
{
    
double  fRet  =  ToDouble(value.GetBuffer(value.GetLength()));
    value.ReleaseBuffer();

    
return  fRet;
}
double  GFX_Convert::ToDouble(LPCTSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" double GFX_Convert::ToDouble(LPCTSTR value): value is NULL! " ));
        
return   0 ;
    }
    
    
double  fRef  = 0 ;
    
try {
        fRef 
=  atof(value);
    }
    
catch (...){
        CString csError; 
        csError.Format(_T(
" double GFX_Convert::ToDouble(LPCTSTR value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }
    
    
return  fRef;
}
/*  To Double end */

/*  To CString begin */
CString GFX_Convert::ToCString(LPCTSTR value)
{
    CString csRet; csRet.Format(_T(
" %s " ),value);
    
return  csRet;
}
CString GFX_Convert::ToCString(
int  value)
{
    CString csRet; csRet.Format(_T(
" %d " ),value);
    
return  csRet;
}
CString GFX_Convert::ToCString(
float  value)
{
    CString csRet; csRet.Format(_T(
" %f " ),value);
    
return  csRet;
}
CString GFX_Convert::ToCString(
double  value)
{
    CString csRet; csRet.Format(_T(
" %f " ),value);
    
return  csRet;
}
CString GFX_Convert::ToCString(BSTR value)
{
    
return  CString(value);
}
CString GFX_Convert::ToCString(CTime value)
{
    
return  value.Format(_T( " %Y/%m/%d %H:%M:%S " ));
}

CString GFX_Convert::ToCString(LPCWSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" CString GFX_Convert::ToCString(LPCWSTR value): value is NULL! " ));
        
return   "" ;
    }

    
return  CString(value);
}
/*  To CString end */


/*  To wide char begin */
LPWSTR GFX_Convert::ToWideChar(CString value)
{
    
return  value.AllocSysString();
}
LPWSTR GFX_Convert::ToWideChar(BSTR value)
{
    
return  ToWideChar(ToCString(value));
}
LPWSTR GFX_Convert::ToWideChar(LPCTSTR value)
{
    
return  ToWideChar(ToCString(value));
}
BOOL GFX_Convert::FreeWideChar(LPWSTR value)
{
    
return  FreeBSTR(value);
}
/*  To wide char end */


/*  To BSTR begin */
BSTR GFX_Convert::ToBSTR(CString value)
{
    
return  value.AllocSysString();
}
BSTR GFX_Convert::ToBSTR(
int  value)
{
    
return  ToCString(value).AllocSysString();
}
BSTR GFX_Convert::ToBSTR(
float  value)
{
    
return  ToCString(value).AllocSysString();
}
BSTR GFX_Convert::ToBSTR(
double  value)
{
    
return  ToCString(value).AllocSysString();
}
BSTR GFX_Convert::ToBSTR(LPCTSTR value)
{
    
return  ToCString(value).AllocSysString();
}
BOOL GFX_Convert::FreeBSTR(BSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" BOOL GFX_Convert::FreeBSTR(BSTR value): value is NULL! " ));
        
return  FALSE;
    }

    
try {
        SysFreeString(value);
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" BOOL GFX_Convert::FreeBSTR(BSTR value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
        
return  FALSE;
    }
    
return  TRUE;
}
/*  To BSTR end */


/*  To CharPointer begin */
LPTSTR GFX_Convert::ToCharPointer(CString value)
{
    TCHAR
*  p  =  NULL;
    
try {
        DWORD dwLen 
=  value.GetLength();
        p 
=   new  TCHAR[dwLen];
        memset(p,
0 ,dwLen);
        memcpy(p,value.GetBuffer(dwLen),dwLen);
        value.ReleaseBuffer();
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" LPCTSTR GFX_Convert::ToCharPointer(CString value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
    }

    
return  p;
}
LPTSTR GFX_Convert::ToCharPointer(
int  value)
{
    
return  ToCharPointer(ToCString(value));
}
LPTSTR GFX_Convert::ToCharPointer(
float  value)
{
    
return  ToCharPointer(ToCString(value));
}
LPTSTR GFX_Convert::ToCharPointer(
double  value)
{
    
return  ToCharPointer(ToCString(value));
}
LPTSTR GFX_Convert::ToCharPointer(BSTR value)
{
    
return  ToCharPointer(ToCString(value));
}

BOOL GFX_Convert::FreeCharPointer(LPTSTR value)
{
    
if (NULL  ==  value ){
        ThrowException(_T(
" BOOL FreeCharPointer(LPCTSTR value): value is NULL! " ));
        
return  FALSE;
    }

    
try {
        delete value;
    }
catch (...){
        CString csError; 
        csError.Format(_T(
" BOOL FreeCharPointer(LPCTSTR value): ERROR_OCCUR! value is: %s " ),value);
        ThrowException(csError);
        
return  FALSE;
    }
    
return  TRUE;
}

/*  To CharPointer end */


void  GFX_Convert::ThrowException(CString csError)
{
    GFX_ConvertException 
* pEx  =   new  GFX_ConvertException(csError);

    TRACE1(_T(
" Warning: throwing GFX_ConvertException for error "%s" " ), csError);
    THROW(pEx);
}

 

 如下是.GFX_ConvertException.h文件:异常类定义

#pragma  once

#define  EX_BUFFER_SIZE      1024


class  GFX_ConvertException :  public  CException
{
public :
    GFX_ConvertException(CString csError)
    {
        
this -> m_csError  =  csError;
    }
    
~ GFX_ConvertException(){}

    
virtual  BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,    PUINT pnHelpContext  =  NULL);
    
virtual  BOOL GetErrorMessage(CString &  sError,    PUINT pnHelpContext  =  NULL);
    CString GetErrorMessage();
private :
    CString m_csError;
};

 

 如下是GFX_ConvertException.cpp文件.异常类实现文件.



#include 
" StdAfx.h "
#include 
" GFX_ConvertException.h "


BOOL GFX_ConvertException::GetErrorMessage(LPTSTR pstrError, UINT nMaxError, PUINT pnHelpContext)
{
  ASSERT(pstrError 
!=  NULL  &&  AfxIsValidString(pstrError, nMaxError));

  
// We don't support help context at the moment
   if  (pnHelpContext  !=  NULL)
    
* pnHelpContext  =   0 ;
    
    lstrcpyn(pstrError,
this -> m_csError.GetBuffer( this -> m_csError.GetLength()),nMaxError);
    
this -> m_csError.ReleaseBuffer();
  
    
return  TRUE;
}

BOOL GFX_ConvertException::GetErrorMessage(CString
&  sError, PUINT pnHelpContext)
{
  LPTSTR pszBuffer 
=  sError.GetBuffer(EX_BUFFER_SIZE);
  BOOL bSuccess 
=  GetErrorMessage(pszBuffer, EX_BUFFER_SIZE, pnHelpContext);
  sError.ReleaseBuffer();
  
return  bSuccess;
}

CString GFX_ConvertException::GetErrorMessage()
{
    
return   this -> m_csError;
}

 如下是.对于GFX_Convert类的简单应用.

 

        CTime time;
        
int  n  =   10 ;
        
float  f  =   3.02150000f ;
        
double  d  =   2.071000506 ;
        BYTE b[
4 =  { 1 , 0 , 0 , 0 };
        
try {
            printf(
" n = %s " ,GFX_Convert::ToCString(n));
            printf(
" f = %s " ,GFX_Convert::ToCString(f));
            printf(
" d = %s " ,GFX_Convert::ToCString(d));
            printf(
" b to int is %s " ,GFX_Convert::ToCString(GFX_Convert::ToInt(b)));
            printf(
" b to float is %s " ,GFX_Convert::ToCString(GFX_Convert::ToFloat(b)));
            printf(
" b to CTime is %s " ,GFX_Convert::ToCString(GFX_Convert::ToCTime(b)));

            
char   * =  NULL;
            GFX_Convert::ToInt(p);
        }
catch (GFX_ConvertException  * pEx){
            printf(
" %s " ,pEx -> GetErrorMessage());
            pEx
-> Delete();
        }


        LPWSTR wstr 
=  GFX_Convert::ToWideChar( " 郭鳳翔 " );
        printf(
" %s " ,GFX_Convert::ToCString((LPCWSTR)wstr));
        GFX_Convert::FreeBSTR(wstr);

 PS:2007/11/19日重新编辑.听取优快云 KeSummer  意见,将char* 改为 LPCTSTR. 添加LPWSTR转换.(实际上BSTR在非OLE2ANSI下就是LPWSTR,为让工具类使用更容易理解.单独添加了LPWSTR转换).

   为了看到一个完整的,对项目开发有利的开源工具类.希望能够得到大家的支持.

   有任何建议和意见请与我联系.guofengxiang-9@163.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值