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.4 KiB
131 lines
3.4 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();
|
|
}
|