📄 comutil.h
字号:
// Construct either a VT_I4 VARIANT, a VT_BOOL VARIANT, or a
// VT_ERROR VARIANT from a long (the default is VT_I4)
//
inline _variant_t::_variant_t(long lSrc, VARTYPE vtSrc) throw(_com_error)
{
if ((vtSrc != VT_I4) && (vtSrc != VT_ERROR) && (vtSrc != VT_BOOL)) {
_com_issue_error(E_INVALIDARG);
}
if (vtSrc == VT_ERROR) {
V_VT(this) = VT_ERROR;
V_ERROR(this) = lSrc;
}
else if (vtSrc == VT_BOOL) {
V_VT(this) = VT_BOOL;
V_BOOL(this) = (lSrc ? VARIANT_TRUE : VARIANT_FALSE);
}
else {
V_VT(this) = VT_I4;
V_I4(this) = lSrc;
}
}
// Construct a VT_R4 VARIANT from a float
//
inline _variant_t::_variant_t(float fltSrc) throw()
{
V_VT(this) = VT_R4;
V_R4(this) = fltSrc;
}
// Construct either a VT_R8 VARIANT, or a VT_DATE VARIANT from
// a double (the default is VT_R8)
//
inline _variant_t::_variant_t(double dblSrc, VARTYPE vtSrc) throw(_com_error)
{
if ((vtSrc != VT_R8) && (vtSrc != VT_DATE)) {
_com_issue_error(E_INVALIDARG);
}
if (vtSrc == VT_DATE) {
V_VT(this) = VT_DATE;
V_DATE(this) = dblSrc;
}
else {
V_VT(this) = VT_R8;
V_R8(this) = dblSrc;
}
}
// Construct a VT_CY from a CY
//
inline _variant_t::_variant_t(const CY& cySrc) throw()
{
V_VT(this) = VT_CY;
V_CY(this) = cySrc;
}
// Construct a VT_BSTR VARIANT from a const _bstr_t&
//
inline _variant_t::_variant_t(const _bstr_t& bstrSrc) throw(_com_error)
{
BSTR bstr = static_cast<wchar_t*>(bstrSrc);
BSTR tmp = ::SysAllocStringByteLen(reinterpret_cast<char*>(bstr),
::SysStringByteLen(bstr));
if (tmp == NULL) {
_com_issue_error(E_OUTOFMEMORY);
} else {
V_VT(this) = VT_BSTR;
V_BSTR(this) = tmp;
}
}
// Construct a VT_BSTR VARIANT from a const wchar_t*
//
inline _variant_t::_variant_t(const wchar_t* pSrc) throw(_com_error)
{
wchar_t*tmp = ::SysAllocString(pSrc);
if (tmp == NULL && pSrc != NULL) {
_com_issue_error(E_OUTOFMEMORY);
} else {
V_VT(this) = VT_BSTR;
V_BSTR(this) = tmp;
}
}
// Construct a VT_BSTR VARIANT from a const char*
//
inline _variant_t::_variant_t(const char* pSrc) throw(_com_error)
{
V_VT(this) = VT_BSTR;
V_BSTR(this) = _com_util::ConvertStringToBSTR(pSrc);
if (V_BSTR(this) == NULL && pSrc != NULL) {
_com_issue_error(E_OUTOFMEMORY);
}
}
// Construct a VT_DISPATCH VARIANT from an IDispatch*
//
inline _variant_t::_variant_t(IDispatch* pSrc, bool fAddRef) throw()
{
V_VT(this) = VT_DISPATCH;
V_DISPATCH(this) = pSrc;
// Need the AddRef() as VariantClear() calls Release(), unless fAddRef
// false indicates we're taking ownership
//
if (fAddRef) {
V_DISPATCH(this)->AddRef();
}
}
// Construct a VT_BOOL VARIANT from a bool
//
inline _variant_t::_variant_t(bool bSrc) throw()
{
V_VT(this) = VT_BOOL;
V_BOOL(this) = (bSrc ? VARIANT_TRUE : VARIANT_FALSE);
}
// Construct a VT_UNKNOWN VARIANT from an IUnknown*
//
inline _variant_t::_variant_t(IUnknown* pSrc, bool fAddRef) throw()
{
V_VT(this) = VT_UNKNOWN;
V_UNKNOWN(this) = pSrc;
// Need the AddRef() as VariantClear() calls Release(), unless fAddRef
// false indicates we're taking ownership
//
if (fAddRef) {
V_UNKNOWN(this)->AddRef();
}
}
// Construct a VT_DECIMAL VARIANT from a DECIMAL
//
inline _variant_t::_variant_t(const DECIMAL& decSrc) throw()
{
// Order is important here! Setting V_DECIMAL wipes out the entire VARIANT
//
V_DECIMAL(this) = decSrc;
V_VT(this) = VT_DECIMAL;
}
// Construct a VT_UI1 VARIANT from a BYTE (unsigned char)
//
inline _variant_t::_variant_t(BYTE bSrc) throw()
{
V_VT(this) = VT_UI1;
V_UI1(this) = bSrc;
}
// Construct a VT_I8 VARIANT from a LONGLONG
//
inline _variant_t::_variant_t(LONGLONG llSrc) throw()
{
V_VT(this) = VT_I8;
V_I8(this) = llSrc;
}
// Construct a VT_UI8 VARIANT from a ULONGLONG
//
inline _variant_t::_variant_t(ULONGLONG ullSrc) throw()
{
V_VT(this) = VT_UI8;
V_UI8(this) = ullSrc;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// Extractors
//
//////////////////////////////////////////////////////////////////////////////////////////
// Extracts a VT_I2 into a short
//
inline _variant_t::operator short() const throw(_com_error)
{
if (V_VT(this) == VT_I2) {
return V_I2(this);
}
_variant_t varDest;
varDest.ChangeType(VT_I2, this);
return V_I2(&varDest);
}
// Extracts a VT_I4 into a long
//
inline _variant_t::operator long() const throw(_com_error)
{
if (V_VT(this) == VT_I4) {
return V_I4(this);
}
_variant_t varDest;
varDest.ChangeType(VT_I4, this);
return V_I4(&varDest);
}
// Extracts a VT_R4 into a float
//
inline _variant_t::operator float() const throw(_com_error)
{
if (V_VT(this) == VT_R4) {
return V_R4(this);
}
_variant_t varDest;
varDest.ChangeType(VT_R4, this);
return V_R4(&varDest);
}
// Extracts a VT_R8 into a double
//
inline _variant_t::operator double() const throw(_com_error)
{
if (V_VT(this) == VT_R8) {
return V_R8(this);
}
_variant_t varDest;
varDest.ChangeType(VT_R8, this);
return V_R8(&varDest);
}
// Extracts a VT_CY into a CY
//
inline _variant_t::operator CY() const throw(_com_error)
{
if (V_VT(this) == VT_CY) {
return V_CY(this);
}
_variant_t varDest;
varDest.ChangeType(VT_CY, this);
return V_CY(&varDest);
}
// Extracts a VT_BSTR into a _bstr_t
//
inline _variant_t::operator _bstr_t() const throw(_com_error)
{
if (V_VT(this) == VT_BSTR) {
return V_BSTR(this);
}
_variant_t varDest;
varDest.ChangeType(VT_BSTR, this);
return V_BSTR(&varDest);
}
// Extracts a VT_DISPATCH into an IDispatch*
//
inline _variant_t::operator IDispatch*() const throw(_com_error)
{
if (V_VT(this) == VT_DISPATCH) {
V_DISPATCH(this)->AddRef();
return V_DISPATCH(this);
}
_variant_t varDest;
varDest.ChangeType(VT_DISPATCH, this);
V_DISPATCH(&varDest)->AddRef();
return V_DISPATCH(&varDest);
}
// Extract a VT_BOOL into a bool
//
inline _variant_t::operator bool() const throw(_com_error)
{
if (V_VT(this) == VT_BOOL) {
return V_BOOL(this) ? true : false;
}
_variant_t varDest;
varDest.ChangeType(VT_BOOL, this);
return V_BOOL(&varDest) ? true : false;
}
// Extracts a VT_UNKNOWN into an IUnknown*
//
inline _variant_t::operator IUnknown*() const throw(_com_error)
{
if (V_VT(this) == VT_UNKNOWN) {
V_UNKNOWN(this)->AddRef();
return V_UNKNOWN(this);
}
_variant_t varDest;
varDest.ChangeType(VT_UNKNOWN, this);
V_UNKNOWN(&varDest)->AddRef();
return V_UNKNOWN(&varDest);
}
// Extracts a VT_DECIMAL into a DECIMAL
//
inline _variant_t::operator DECIMAL() const throw(_com_error)
{
if (V_VT(this) == VT_DECIMAL) {
return V_DECIMAL(this);
}
_variant_t varDest;
varDest.ChangeType(VT_DECIMAL, this);
return V_DECIMAL(&varDest);
}
// Extracts a VT_UI1 into a BYTE (unsigned char)
//
inline _variant_t::operator BYTE() const throw(_com_error)
{
if (V_VT(this) == VT_UI1) {
return V_UI1(this);
}
_variant_t varDest;
varDest.ChangeType(VT_UI1, this);
return V_UI1(&varDest);
}
// Extracts a VT_I8 into a LONGLONG
//
inline _variant_t::operator LONGLONG() const throw(_com_error)
{
if(V_VT(this) == VT_I8) {
return V_I8(this);
}
_variant_t varDest;
varDest.ChangeType(VT_I8, this);
return (V_I8(&varDest));
}
// Extracts a VT_UI8 into a ULONGLONG
//
inline _variant_t::operator ULONGLONG() const throw(_com_error)
{
if(V_VT(this) == VT_UI8) {
return V_UI8(this);
}
_variant_t varDest;
varDest.ChangeType(VT_UI8, this);
return (V_UI8(&varDest));
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// Assignment operations
//
//////////////////////////////////////////////////////////////////////////////////////////
// Assign a const VARIANT& (::VariantCopy handles everything)
//
inline _variant_t& _variant_t::operator=(const VARIANT& varSrc) throw(_com_error)
{
_com_util::CheckError(::VariantCopy(this, const_cast<VARIANT*>(&varSrc)));
return *this;
}
// Assign a const VARIANT* (::VariantCopy handles everything)
//
inline _variant_t& _variant_t::operator=(const VARIANT* pSrc) throw(_com_error)
{
_com_util::CheckError(::VariantCopy(this, const_cast<VARIANT*>(pSrc)));
return *this;
}
// Assign a const _variant_t& (::VariantCopy handles everything)
//
inline _variant_t& _variant_t::operator=(const _variant_t& varSrc) throw(_com_error)
{
_com_util::CheckError(::VariantCopy(this, const_cast<VARIANT*>(static_cast<const VARIANT*>(&varSrc))));
return *this;
}
// Assign a short creating either VT_I2 VARIANT or a
// VT_BOOL VARIANT (VT_I2 is the default)
//
inline _variant_t& _variant_t::operator=(short sSrc) throw(_com_error)
{
if (V_VT(this) == VT_I2) {
V_I2(this) = sSrc;
}
else if (V_VT(this) == VT_BOOL) {
V_BOOL(this) = (sSrc ? VARIANT_TRUE : VARIANT_FALSE);
}
else {
// Clear the VARIANT and create a VT_I2
//
Clear();
V_VT(this) = VT_I2;
V_I2(this) = sSrc;
}
return *this;
}
// Assign a long creating either VT_I4 VARIANT, a VT_ERROR VARIANT
// or a VT_BOOL VARIANT (VT_I4 is the default)
//
inline _variant_t& _variant_t::operator=(long lSrc) throw(_com_error)
{
if (V_VT(this) == VT_I4) {
V_I4(this) = lSrc;
}
else if (V_VT(this) == VT_ERROR) {
V_ERROR(this) = lSrc;
}
else if (V_VT(this) == VT_BOOL) {
V_BOOL(this) = (lSrc ? VARIANT_TRUE : VARIANT_FALSE);
}
else {
// Clear the VARIANT and create a VT_I4
//
Clear();
V_VT(this) = VT_I4;
V_I4(this) = lSrc;
}
return *this;
}
// Assign a float creating a VT_R4 VARIANT
//
inline _variant_t& _variant_t::operator=(float fltSrc) throw(_com_error)
{
if (V_VT(this) != VT_R4) {
// Clear the VARIANT and create a VT_R4
//
Clear();
V_VT(this) = VT_R4;
}
V_R4(this) = fltSrc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -