Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
3.2 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: QueryUnk.cxx
//
// Contents: Controlling IUnknown interface for IQuery/IRowset
//
// History: 18 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <rowset.hxx>
#include "queryunk.hxx"
//+-------------------------------------------------------------------------
//
// Member: CQueryUnknown::QueryInterface, public
//
// Arguments: [ifid] -- Interface id
// [ppiuk] -- Interface return pointer
//
// Returns: Error. No rebind from this class is supported.
//
// History: 18 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
STDMETHODIMP CQueryUnknown::QueryInterface( REFIID ifid, void ** ppiuk )
{
*ppiuk = 0;
return E_NOINTERFACE;
}
//+-------------------------------------------------------------------------
//
// Member: CQueryUnknown::AddRef, public
//
// Synopsis: Reference the virtual table.
//
// History: 18 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CQueryUnknown::AddRef(void)
{
return InterlockedIncrement( (long *)&_ref );
}
//+-------------------------------------------------------------------------
//
// Member: CQueryUnknown::Release, public
//
// Synopsis: De-Reference the virtual table.
//
// Effects: If the ref count goes to 0 then the table is deleted.
//
// History: 18 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CQueryUnknown::Release(void)
{
long l = InterlockedDecrement( (long *)&_ref );
if ( l <= 0 )
{
// delete the rowsets allocated (if any)
ReInit();
_rUnk.Release(); // final reference, drop the owner's refcount
return 0;
}
return l;
}
//+-------------------------------------------------------------------------
//
// Member: CQueryUnknown::ReInit, public
//
// Synopsis: Prepares for execution of a new query
//
// Arguments: [cRowsets] -- # of rowsets in ppRowsets
// [ppRowsets] -- Array of CRowset pointers
//
// History: 18 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
void CQueryUnknown::ReInit( ULONG cRowsets,
CRowset ** ppRowsets )
{
for (unsigned i = 0; i < _cRowsets; i++)
delete _apRowsets[i];
delete [] _apRowsets;
Win4Assert(_ref == 0 || _ref == cRowsets);
if (cRowsets == 0)
_ref = 0;
_cRowsets = cRowsets;
_apRowsets = ppRowsets;
if (cRowsets > 0)
_rUnk.AddRef();
}
//+-------------------------------------------------------------------------
//
// Member: CQueryUnknown::~CQueryUnknown, private
//
// Synopsis: Clean up
//
// History: 18-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
CQueryUnknown::~CQueryUnknown()
{
ReInit();
}