📄 olevar.cpp
字号:
lReturns -= 24;
return lReturns;
}
long COleDateTimeSpan::GetMinutes() const
{
ASSERT(GetStatus() == valid);
double dblTemp;
// Truncate hours and scale up
dblTemp = modf(m_span * 24, &dblTemp);
long lReturns = (long) ((dblTemp + AFX_OLE_DATETIME_HALFSECOND) * 60);
if (lReturns >= 60)
lReturns -= 60;
return lReturns;
}
long COleDateTimeSpan::GetSeconds() const
{
ASSERT(GetStatus() == valid);
double dblTemp;
// Truncate minutes and scale up
dblTemp = modf(m_span * 24 * 60, &dblTemp);
long lReturns = (long) ((dblTemp + AFX_OLE_DATETIME_HALFSECOND) * 60);
if (lReturns >= 60)
lReturns -= 60;
return lReturns;
}
const COleDateTimeSpan& COleDateTimeSpan::operator=(double dblSpanSrc)
{
m_span = dblSpanSrc;
SetStatus(valid);
return *this;
}
const COleDateTimeSpan& COleDateTimeSpan::operator=(const COleDateTimeSpan& dateSpanSrc)
{
m_span = dateSpanSrc.m_span;
m_status = dateSpanSrc.m_status;
return *this;
}
COleDateTimeSpan COleDateTimeSpan::operator+(const COleDateTimeSpan& dateSpan) const
{
COleDateTimeSpan dateSpanTemp;
// If either operand Null, result Null
if (GetStatus() == null || dateSpan.GetStatus() == null)
{
dateSpanTemp.SetStatus(null);
return dateSpanTemp;
}
// If either operand Invalid, result Invalid
if (GetStatus() == invalid || dateSpan.GetStatus() == invalid)
{
dateSpanTemp.SetStatus(invalid);
return dateSpanTemp;
}
// Add spans and validate within legal range
dateSpanTemp.m_span = m_span + dateSpan.m_span;
dateSpanTemp.CheckRange();
return dateSpanTemp;
}
COleDateTimeSpan COleDateTimeSpan::operator-(const COleDateTimeSpan& dateSpan) const
{
COleDateTimeSpan dateSpanTemp;
// If either operand Null, result Null
if (GetStatus() == null || dateSpan.GetStatus() == null)
{
dateSpanTemp.SetStatus(null);
return dateSpanTemp;
}
// If either operand Invalid, result Invalid
if (GetStatus() == invalid || dateSpan.GetStatus() == invalid)
{
dateSpanTemp.SetStatus(invalid);
return dateSpanTemp;
}
// Subtract spans and validate within legal range
dateSpanTemp.m_span = m_span - dateSpan.m_span;
dateSpanTemp.CheckRange();
return dateSpanTemp;
}
void COleDateTimeSpan::SetDateTimeSpan(
long lDays, int nHours, int nMins, int nSecs)
{
// Set date span by breaking into fractional days (all input ranges valid)
m_span = lDays + ((double)nHours)/24 + ((double)nMins)/(24*60) +
((double)nSecs)/(24*60*60);
SetStatus(valid);
}
CString COleDateTimeSpan::Format(LPCTSTR pFormat) const
{
CString strSpan;
struct tm tmTemp;
// If null, return empty string
if (GetStatus() == null)
return strSpan;
// If invalid, return DateTimeSpan resource string
if (GetStatus() == invalid || !_AfxTmFromOleDate(m_span, tmTemp))
{
VERIFY(strSpan.LoadString(AFX_IDS_INVALID_DATETIMESPAN));
return strSpan;
}
// Convert tm from afx internal format to standard format
_AfxTmConvertToStandardFormat(tmTemp);
// _tcsftime() doesn't handle %D, so do it here
CString strPreParsed;
LPCTSTR pstrSource = pFormat;
int nTargetChar = 0;
int nAccumulatedLength = lstrlen(pFormat);
LPTSTR pstrTarget = strPreParsed.GetBuffer(nAccumulatedLength);
while (*pstrSource)
{
if (*pstrSource == '%' && pstrSource[1] == 'D')
{
TCHAR szDay[12];
_itot(GetDays(), szDay, 10);
strPreParsed.ReleaseBuffer(nTargetChar);
strPreParsed += szDay;
int nTemp = lstrlen(szDay);
nAccumulatedLength += nTemp;
nTargetChar += nTemp;
pstrTarget = strPreParsed.GetBuffer(nAccumulatedLength)
+ nTargetChar;
pstrSource = _tcsinc(pstrSource);
pstrSource = _tcsinc(pstrSource);
}
*pstrTarget = *pstrSource;
nTargetChar++;
pstrSource = _tcsinc(pstrSource);
pstrTarget = _tcsinc(pstrTarget);
}
strPreParsed.ReleaseBuffer(nTargetChar);
// Fill in the buffer, disregard return value as it's not necessary
LPTSTR lpszTemp = strSpan.GetBufferSetLength(MAX_TIME_BUFFER_SIZE);
_tcsftime(lpszTemp, strSpan.GetLength(), (LPCTSTR) strPreParsed, &tmTemp);
strSpan.ReleaseBuffer();
return strSpan;
}
CString COleDateTimeSpan::Format(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return Format(strFormat);
}
void COleDateTimeSpan::CheckRange()
{
if(m_span < -MAX_DAYS_IN_SPAN || m_span > MAX_DAYS_IN_SPAN)
SetStatus(invalid);
}
// serialization
#ifdef _DEBUG
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleDateTimeSpan dateSpanSrc)
{
dc << "\nCOleDateTimeSpan Object:";
dc << "\n\tm_status = " << (long)dateSpanSrc.m_status;
COleVariant var(dateSpanSrc.m_span);
var.ChangeType(VT_BSTR);
return dc << "\n\tdateSpan = " << var.bstrVal;
}
#endif // _DEBUG
CArchive& AFXAPI operator<<(CArchive& ar, COleDateTimeSpan dateSpanSrc)
{
ar << (long)dateSpanSrc.m_status;
return ar << dateSpanSrc.m_span;
}
CArchive& AFXAPI operator>>(CArchive& ar, COleDateTimeSpan& dateSpanSrc)
{
ar >> (long&)dateSpanSrc.m_status;
return ar >> dateSpanSrc.m_span;
}
/////////////////////////////////////////////////////////////////////////////
// COleSafeArray class
COleSafeArray::COleSafeArray(const SAFEARRAY& saSrc, VARTYPE vtSrc)
{
AfxSafeArrayInit(this);
vt = (VARTYPE)(vtSrc | VT_ARRAY);
AfxCheckError(::SafeArrayCopy((LPSAFEARRAY)&saSrc, &parray));
m_dwDims = GetDim();
m_dwElementSize = GetElemSize();
}
COleSafeArray::COleSafeArray(LPCSAFEARRAY pSrc, VARTYPE vtSrc)
{
AfxSafeArrayInit(this);
vt = (VARTYPE)(vtSrc | VT_ARRAY);
AfxCheckError(::SafeArrayCopy((LPSAFEARRAY)pSrc, &parray));
m_dwDims = GetDim();
m_dwElementSize = GetElemSize();
}
COleSafeArray::COleSafeArray(const COleSafeArray& saSrc)
{
AfxSafeArrayInit(this);
*this = saSrc;
m_dwDims = GetDim();
m_dwElementSize = GetElemSize();
}
COleSafeArray::COleSafeArray(const VARIANT& varSrc)
{
AfxSafeArrayInit(this);
*this = varSrc;
m_dwDims = GetDim();
m_dwElementSize = GetElemSize();
}
COleSafeArray::COleSafeArray(LPCVARIANT pSrc)
{
AfxSafeArrayInit(this);
*this = pSrc;
m_dwDims = GetDim();
m_dwElementSize = GetElemSize();
}
// Operations
void COleSafeArray::Attach(VARIANT& varSrc)
{
ASSERT(varSrc.vt & VT_ARRAY);
// Free up previous safe array if necessary
Clear();
// give control of data to COleSafeArray
memcpy(this, &varSrc, sizeof(varSrc));
varSrc.vt = VT_EMPTY;
}
VARIANT COleSafeArray::Detach()
{
VARIANT varResult = *this;
vt = VT_EMPTY;
return varResult;
}
// Assignment operators
COleSafeArray& COleSafeArray::operator=(const COleSafeArray& saSrc)
{
ASSERT(saSrc.vt & VT_ARRAY);
AfxCheckError(::VariantCopy(this, (LPVARIANT)&saSrc));
return *this;
}
COleSafeArray& COleSafeArray::operator=(const VARIANT& varSrc)
{
ASSERT(varSrc.vt & VT_ARRAY);
AfxCheckError(::VariantCopy(this, (LPVARIANT)&varSrc));
return *this;
}
COleSafeArray& COleSafeArray::operator=(LPCVARIANT pSrc)
{
ASSERT(pSrc->vt & VT_ARRAY);
AfxCheckError(::VariantCopy(this, (LPVARIANT)pSrc));
return *this;
}
COleSafeArray& COleSafeArray::operator=(const COleVariant& varSrc)
{
ASSERT(varSrc.vt & VT_ARRAY);
AfxCheckError(::VariantCopy(this, (LPVARIANT)&varSrc));
return *this;
}
// Comparison operators
BOOL COleSafeArray::operator==(const SAFEARRAY& saSrc) const
{
return _AfxCompareSafeArrays(parray, (LPSAFEARRAY)&saSrc);
}
BOOL COleSafeArray::operator==(LPCSAFEARRAY pSrc) const
{
return _AfxCompareSafeArrays(parray, (LPSAFEARRAY)pSrc);
}
BOOL COleSafeArray::operator==(const COleSafeArray& saSrc) const
{
if (vt != saSrc.vt)
return FALSE;
return _AfxCompareSafeArrays(parray, saSrc.parray);
}
BOOL COleSafeArray::operator==(const VARIANT& varSrc) const
{
if (vt != varSrc.vt)
return FALSE;
return _AfxCompareSafeArrays(parray, varSrc.parray);
}
BOOL COleSafeArray::operator==(LPCVARIANT pSrc) const
{
if (vt != pSrc->vt)
return FALSE;
return _AfxCompareSafeArrays(parray, pSrc->parray);
}
BOOL COleSafeArray::operator==(const COleVariant& varSrc) const
{
if (vt != varSrc.vt)
return FALSE;
return _AfxCompareSafeArrays(parray, varSrc.parray);
}
#ifdef _DEBUG
void _AfxDumpSafeArrayElement(CDumpContext& dc, COleSafeArray& saSrc,
long* piIndices)
{
BYTE* pbData;
pbData = (BYTE*)_alloca( saSrc.GetElemSize() );
saSrc.GetElement(piIndices, pbData);
switch(saSrc.vt&(~VT_ARRAY))
{
case VT_BOOL:
dc << *((VARIANT_BOOL*)pbData);
break;
case VT_I1:
dc << *((char*)pbData);
break;
case VT_I2:
dc << *((short*)pbData);
break;
case VT_I4:
dc << *((long*)pbData);
break;
case VT_UI1:
dc << *((BYTE*)pbData);
break;
case VT_UI2:
dc << *((WORD*)pbData);
break;
case VT_UI4:
dc << *((DWORD*)pbData);
break;
case VT_R4:
dc << *((float*)pbData);
break;
case VT_R8:
dc << *((double*)pbData);
break;
case VT_CY:
{
COleVariant var;
var.vt = VT_CY;
var.cyVal = *((CY*)pbData);
var.ChangeType(VT_BSTR);
dc << var.bstrVal;
}
break;
case VT_DATE:
{
COleVariant var;
var.vt = VT_DATE;
var.date = *((DATE*)pbData);
var.ChangeType(VT_BSTR);
dc << var.bstrVal;
}
case VT_BSTR:
dc << *((BSTR*)pbData);
break;
case VT_ERROR:
dc << *((SCODE*)pbData);
break;
case VT_DISPATCH:
case VT_UNKNOWN:
dc << *((IUnknown**)pbData);
break;
case VT_VARIANT:
{
COleVariant var;
var = *((VARIANT*)pbData);
dc << var;
}
break;
default:
ASSERT(FALSE);
break;
}
}
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleSafeArray& saSrc)
{
long iDimension;
long nDimensions;
long* piLBounds;
long* piUBounds;
long* piIndices;
BOOL bWrapped;
dc << "\nCOleSafeArray Object:";
dc << "\n\tvt = " << saSrc.vt;
dc << "\n\tbounds:";
nDimensions = saSrc.GetDim();
piLBounds = (long*)_alloca( nDimensions*sizeof( long ) );
piUBounds = (long*)_alloca( nDimensions*sizeof( long ) );
piIndices = (long*)_alloca( nDimensions*sizeof( long ) );
// Dump the bounds
for( iDimension = 0; iDimension < nDimensions; iDimension++ )
{
saSrc.GetLBound( iDimension+1, &piLBounds[iDimension] );
saSrc.GetUBound( iDimension+1, &piUBounds[iDimension] );
dc << "\n\t(" << piLBounds[iDimension] << ", " <<
piUBounds[iDimension] << ")";
}
if( dc.GetDepth() > 0 )
{
// Dump the contents of the array.
for( iDimension = 0; iDimension < nDimensions; iDimension++ )
{
piIndices[iDimension] = piLBounds[iDimension];
}
while( piIndices[0] <= piUBounds[0] )
{
dc << "\n\t";
for( iDimension = 0; iDimension < nDimensions; iDimension++ )
{
dc << "[" << piIndices[iDimension] << "]";
}
dc << " = ";
// Dump the value of the element
_AfxDumpSafeArrayElement(dc, saSrc, piIndices);
// Increment the rightmost index, with wraparound and carry logic
iDimension = nDimensions-1;
bWrapped = TRUE;
do
{
bWrapped = FALSE;
piIndices[iDimension]++;
if( piIndices[iDimension] > piUBounds[iDimension] )
{
if( iDimension > 0 )
{
// We've overstepped the bounds of this dimension, so wrap
// around to the lower bound and make sure to increment the
// next dimension to the left.
bWrapped = TRUE;
piIndices[iDimension] = piLBounds[iDimension];
iDimension--;
}
}
} while( bWrapped && (iDimension >= 0) );
}
}
return dc;
}
#endif // _DEBUG
void COleSafeArray::CreateOneDim(VARTYPE vtSrc, DWORD dwElements,
const void* pvSrcData, long nLBound)
{
ASSERT(dwElements > 0);
// Setup the bounds and create the array
SAFEARRAYBOUND rgsabound;
rgsabound.cElements = dwElements;
rgsabound.lLbound = nLBound;
Create(vtSrc, 1, &rgsabound);
// Copy over the data if neccessary
if (pvSrcData != NULL)
{
void* pvDestData;
AccessData(&pvDestData);
memcpy(pvDestData, pvSrcData, GetElemSize() * dwElements);
UnaccessData();
}
}
DWORD COleSafeArray::GetOneDimSize()
{
ASSERT(GetDim() == 1);
long nUBound, nLBound;
GetUBound(1, &nUBound);
GetLBound(1, &nLBound);
return nUBound + 1 - nLBound;
}
void COleSafeArray::ResizeOneDim(DWORD dwElements)
{
ASSERT(GetDim() == 1);
SAFEARRAYBOUND rgsabound;
rgsabound.cElements = dwElements;
rgsabound.lLbound = 0;
Redim(&rgsabound);
}
void COleSafeArray::Create(VARTYPE vtSrc, DWORD dwDi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -