www.pudn.com > 200311301927570.rar > variantbufconvert.cpp


// VariantBufConvert.cpp: implementation of the CVariantBufConvert class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
//#include "VariantResearch.h" 
#include "VariantBufConvert.h" 
//#include "Shlwapi.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CVariantBufConvert::CVariantBufConvert() 
{ 
	 
} 
 
CVariantBufConvert::~CVariantBufConvert() 
{ 
	 
} 
 
BOOL CVariantBufConvert::BufToVariant(VARIANT &var, void *Buf, int BufSize) 
{ 
	if(BufSize<=0) 
		return FALSE; 
	SAFEARRAY * psa=NULL; 
	SAFEARRAYBOUND pBound; 
	pBound.lLbound=0; //该维数组的第一个Index 
	pBound.cElements=BufSize;    //数组个数  
	psa=SafeArrayCreate(VT_UI1,1,&pBound); 
	memcpy(psa->pvData,Buf,BufSize); 
	var.vt=VT_ARRAY|VT_UI1 ; 
	var.parray =psa; 
	return TRUE; 
} 
 
BOOL CVariantBufConvert::VariantToBuf(VARIANT &var, void *Buf, long InputSize,long& ReturnBufSize) 
{ 
	if(Buf==NULL)  //无Buf 
		return FALSE; 
	if(InputSize<=0) 
		return FALSE; 
	if(var.vt !=(VT_ARRAY|VT_UI1))//类型不对 
		return FALSE;   
	SAFEARRAY * psa=var.parray; 
	SafeArrayGetUBound(psa,1,&ReturnBufSize); 
	ReturnBufSize++; 
	if(InputSize>=ReturnBufSize) 
		memcpy(Buf,psa->pvData, ReturnBufSize); 
	else 
	{ 
		memcpy(Buf,psa->pvData, InputSize); 
		ReturnBufSize=InputSize; 
	} 
	return TRUE; 
} 
 
char * CVariantBufConvert::ConvertToBinary(char *tmprs, int nM, char *Hex) 
{ 
	for ( int i = 0; i < nM; i++) 
	{ 
		char tmp[2]; 
		char * stopstring; 
		tmp[0]=Hex[i*2]; 
		tmp[1]=Hex[i*2+1]; 
		tmprs[i] = ( char ) strtoul( tmp, &stopstring, 16 ); 
	} 
	return tmprs; 
} 
/* 
BOOL CVariantBufConvert::ConvertToDecstr(CString strHex64, CString &strDesc) 
{ 
//	__int64 result; 
//	int testSuccess=0; 
//	if(sscanf((char*)(LPCTSTR)(strHex64+" ,$10"),"%I64x ,$%d",&result,&testSuccess)==0) 
//		return FALSE; 
//	if(testSuccess!=10) 
//		return FALSE; 
//	strDesc.Format("%I64u",result); 
//	return TRUE; 
 
	int len = strHex64.GetLength(); 
	strDesc = ""; 
	CString strResult; 
	UINT high,low; 
	//LONGLONG test; 
	if(len>8) 
		strDesc = strHex64.Left(len-8); 
	if(StrToIntEx("0x"+strHex64.Right(8),STIF_SUPPORT_HEX,(int*)&low)&& 
	StrToIntEx("0x"+strDesc,STIF_SUPPORT_HEX,(int*)&high))	//?? 
	{ 
		LONGLONG result=((LONGLONG)high)<<32|(LONGLONG)low;//??int64 
	//	test=result; 
		BOOL bMinus=FALSE; 
		if(result<0)	 
		{ 
			bMinus=TRUE; 
			result=-result; 
		} 
		while(result!=0)	//???????? 
		{ 
			strResult+=(int)(result%10)+0x30; 
			result=result/10; 
		} 
		if(bMinus) 
			strResult+="-"; 
		len=strResult.GetLength(); 
		strDesc.Empty(); 
		while(len--)	//???? 
		{ 
			strDesc+=strResult[len]; 
		} 
		return TRUE; 
	} 
	else					//????,???? 
		return FALSE; 
 
} 
*/