///////////////////////////////////////////////////////////////////////////////
// Name: msw/ole/safearray.cpp
// Purpose: Implementation of wxSafeArrayBase class.
// Author: PB
// Created: 2012-09-23
// Copyright: (c) 2012 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_OLE && wxUSE_VARIANT
#ifndef WX_PRECOMP
#include "wx/variant.h"
#endif // WX_PRECOMP
#include "wx/msw/ole/safearray.h"
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxSafeArrayBase
// ----------------------------------------------------------------------------
void wxSafeArrayBase::Destroy()
{
if ( m_array )
{
Unlock();
HRESULT hr = SafeArrayDestroy(m_array);
if ( FAILED(hr) )
{
wxLogApiError(wxS("SafeArrayDestroy()"), hr);
}
m_array = NULL;
}
}
SAFEARRAY* wxSafeArrayBase::Detach()
{
wxCHECK_MSG( m_array, NULL, wxS("Uninitialized safe array") );
Unlock();
SAFEARRAY* array = m_array;
m_array = NULL;
return array;
}
size_t wxSafeArrayBase::GetDim() const
{
wxASSERT( m_array );
return SafeArrayGetDim(m_array);
}
bool wxSafeArrayBase::GetLBound(size_t dim, long& bound) const
{
wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
wxCHECK_MSG( dim > 0, false, wxS("Invalid dimension index") );
HRESULT hr = SafeArrayGetLBound(m_array, dim, (LONG*)&bound);
if ( FAILED(hr) )
{
wxLogApiError(wxS("SafeArrayGetLBound()"), hr);
return false;
}
return true;
}
bool wxSafeArrayBase::GetUBound(size_t dim, long& bound) const
{
wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
wxCHECK_MSG( dim > 0, false, wxS("Invalid dimension index") );
HRESULT hr = SafeArrayGetUBound(m_array, dim, (LONG*)&bound);
if ( FAILED(hr) )
{
wxLogApiError(wxS("SafeArrayGetUBound()"), hr);
return false;
}
return true;
}
size_t wxSafeArrayBase::GetCount(size_t dim) const
{
long lBound, uBound;
if ( GetLBound(dim, lBound) && GetUBound(dim, uBound) )
return uBound - lBound + 1;
return 0;
}
bool wxSafeArrayBase::Lock()
{
wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
HRESULT hr = SafeArrayLock(m_array);
if ( FAILED(hr) )
{
wxLogApiError(wxS("SafeArrayLock()"), hr);
return false;
}
return true;
}
bool wxSafeArrayBase::Unlock()
{
wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
HRESULT hr = SafeArrayUnlock(m_array);
if ( FAILED(hr) )
{
wxLogApiError(wxS("SafeArrayUnlock()"), hr);
return false;
}
return true;
}
#endif // wxUSE_OLE && wxUSE_VARIANT
↑ V575 The potential null pointer is passed into 'SafeArrayGetDim' function. Inspect the first argument.