下载地址: 本地下载
近半年来又开始用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文件:异常类定义
#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类的简单应用.
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 * p = 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