⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasource.cpp

📁 用测试OLE DB提供者的一个程序。能够测试出OEL DB提供者到底实现了哪些接口?很灵的。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//-----------------------------------------------------------------------------
// Microsoft OLE DB RowsetViewer
// Copyright (C) 1994 - 1998 By Microsoft Corporation.
//
// @doc
//
// @module DATASOURCE.CPP
//
//-----------------------------------------------------------------------------------

/////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////
#include "Common.h"
#include "DataSource.h"
#include "Main.h"


/////////////////////////////////////////////////////////////////
// CBase::CBase
//
/////////////////////////////////////////////////////////////////
CBase::CBase(CMDIChild* pCMDIChild)
{
	//BackPointer
	ASSERT(pCMDIChild);
	m_pCMDIChild =  pCMDIChild;
	
	//OLEDB Interfaces
	m_pIUnknown		= NULL;		
}


/////////////////////////////////////////////////////////////////
// CBase::~CBase
//
/////////////////////////////////////////////////////////////////
CBase::~CBase()
{
	ASSERT(m_pCMDIChild);
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	//Verify Object has no references on it...
	pCListBox->OutputRelease(&m_pIUnknown, "IUnknown", 0);
}


/////////////////////////////////////////////////////////////////
// BOOL CBase::ReleaseBase
//
/////////////////////////////////////////////////////////////////
HRESULT CBase::ReleaseBase(CHAR* pszObject)
{
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	//IUnknown interfaces
	//Shouldn't have any extra references left...
	pCListBox->OutputRelease(&m_pIUnknown, pszObject ? pszObject : "IUnknown", 0);
	return S_OK;
}


/////////////////////////////////////////////////////////////////
// ULONG CBase::AddRef
//
/////////////////////////////////////////////////////////////////
ULONG CBase::AddRef()
{
	//IUnknown::AddRef
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
	return pCListBox->OutputAddRef(m_pIUnknown);
}

/////////////////////////////////////////////////////////////////
// ULONG CBase::Release
//
/////////////////////////////////////////////////////////////////
ULONG CBase::Release()
{
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
	IUnknown* pIUnknown = m_pIUnknown;
	ULONG ulRefCount = 0;

	//IUnknown::Release
	ulRefCount = pCListBox->OutputRelease(&m_pIUnknown);
	if(ulRefCount != 0)
		m_pIUnknown = pIUnknown;

	return ulRefCount;
}


/////////////////////////////////////////////////////////////////
// HRESULT CBase::QueryInterface
//
/////////////////////////////////////////////////////////////////
HRESULT CBase::QueryInterface(REFIID riid)
{
	HRESULT hr = S_OK;
	HWND hWnd = m_pCMDIChild->m_hWnd;
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
	IUnknown* pIUnknown = NULL;
	
	//IUnknown::QueryInterface
	XTEST(hWnd, hr = pCListBox->OutputQI(m_pIUnknown, riid, &pIUnknown));
	
	//We need to put the obtained interface in the 
	//appropiate member or release it...
	if(FAILED(hr) || FAILED(SetInterface(riid, pIUnknown)))
		pCListBox->OutputRelease(&pIUnknown);

	return hr;
}


////////////////////////////////////////////////////////////////
// CBase::GetOptionsObj
//
/////////////////////////////////////////////////////////////////
COptionsDlg* CBase::GetOptionsObj()
{
	ASSERT(m_pCMDIChild);
	return m_pCMDIChild->GetOptionsObj();
}


/////////////////////////////////////////////////////////////////
// CDataSource::CDataSource
//
/////////////////////////////////////////////////////////////////
CDataSource::CDataSource(CMDIChild* pCMDIChild) : CBase(pCMDIChild)
{
	//OLEDB Interfaces
	m_pIDBCreateSession			= NULL;		//DataSource interface
	m_pIDBInitialize			= NULL;		//DataSource interface
	m_pIDBProperties			= NULL;		//DataSource interface
	m_pIPersist					= NULL;		//DataSource interface

	m_pIConnectionPointContainer= NULL;		//DataSource interface
	m_pIDBAsynchStatus			= NULL;		//DataSource interface
	m_pIDBDataSourceAdmin		= NULL;		//DataSource interface
	m_pIDBInfo					= NULL;		//DataSource interface
	m_pIPersistFile				= NULL;		//DataSource interface
	m_pISupportErrorInfo		= NULL;		//DataSource interface
			
	m_pISourcesRowset			= NULL;		//Enumerator interface
	m_pIParseDisplayName		= NULL;		//Enumerator interface
	
	//Extra interfaces
	m_pIConnectionPoint			= NULL;		//Connection interface

	//EnumInfo
	memset(&m_EnumInfo, 0, sizeof(ENUMINFO));
	
	//Properties
	m_pwszDataSource		= NULL;		//DBPROP_DATASOURCENAME
	m_pwszDBMS				= NULL;		//DBPROP_DBMSNAME
	m_pwszDBMSVer			= NULL;		//DBPROP_DBMSVER
	m_pwszProviderName		= NULL;
	m_pwszProviderDesc		= NULL;
	m_fConnected			= FALSE;

	//Listeners
	m_pCAsynchNotify		= new CAsynchNotify(m_pCMDIChild->m_pCListBox);
}

/////////////////////////////////////////////////////////////////
// CDataSource::~CDataSource
//
/////////////////////////////////////////////////////////////////
CDataSource::~CDataSource()
{
	ASSERT(m_pCMDIChild);
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	ReleaseDataSource();
	//Verify Listeners have no extra references on them...
	pCListBox->OutputRelease((IUnknown**)&m_pCAsynchNotify, "IDBAsynchNotify", 0);
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::SetInterface
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::SetInterface(REFIID riid, IUnknown* pIUnknown)
{
	HRESULT hr = S_OK;

	//no-op
	if(pIUnknown == NULL)
		return E_INVALIDARG;

	//If the requested interface is a DataSource interface, place it in the
	//Appropiate member variable, otherwise we have to release it, since we
	//have no place to store it...
	if(riid == IID_IUnknown) 
		m_pIUnknown = pIUnknown;
	else if(riid == IID_IDBCreateSession) 
		m_pIDBCreateSession = (IDBCreateSession*)pIUnknown;
	else if(riid == IID_IDBInitialize) 
		m_pIDBInitialize = (IDBInitialize*)pIUnknown;
	else if(riid == IID_IDBProperties) 
		m_pIDBProperties = (IDBProperties*)pIUnknown;
	else if(riid == IID_IPersist) 
		m_pIPersist = (IPersist*)pIUnknown;
	else if(riid == IID_IConnectionPointContainer) 
		m_pIConnectionPointContainer = (IConnectionPointContainer*)pIUnknown;
	else if(riid == IID_IDBAsynchStatus) 
		m_pIDBAsynchStatus = (IDBAsynchStatus*)pIUnknown;
	else if(riid == IID_IDBDataSourceAdmin) 
		m_pIDBDataSourceAdmin = (IDBDataSourceAdmin*)pIUnknown;
	else if(riid == IID_IDBInfo) 
		m_pIDBInfo = (IDBInfo*)pIUnknown;
	else if(riid == IID_IPersistFile) 
		m_pIPersistFile = (IPersistFile*)pIUnknown;
	else if(riid == IID_ISupportErrorInfo) 
		m_pISupportErrorInfo = (ISupportErrorInfo*)pIUnknown;
	else if(riid == IID_ISourcesRowset) 
		m_pISourcesRowset = (ISourcesRowset*)pIUnknown;
	else if(riid == IID_IParseDisplayName) 
		m_pIParseDisplayName = (IParseDisplayName*)pIUnknown;
	else
		hr = E_NOINTERFACE;

	return hr;
}


/////////////////////////////////////////////////////////////////
// BOOL CDataSource::ReleaseDataSource
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::ReleaseDataSource()
{
	//UnadviseListeners
	UnadviseListeners();

	//DataSource interfaces
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	pCListBox->OutputRelease((IUnknown**)&m_pIDBCreateSession,			"IDBCreateSession");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBInitialize,				"IDBInitialize");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBProperties,				"IDBProperties");
	pCListBox->OutputRelease((IUnknown**)&m_pIPersist,					"IPersist");

	pCListBox->OutputRelease((IUnknown**)&m_pIDBAsynchStatus,			"IDBAsynchStatus");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBDataSourceAdmin,		"IDBDataSourceAdmin");
	pCListBox->OutputRelease((IUnknown**)&m_pIDBInfo,					"IDBInfo");
	pCListBox->OutputRelease((IUnknown**)&m_pIPersistFile,				"IPersistFile");
	pCListBox->OutputRelease((IUnknown**)&m_pISupportErrorInfo,			"ISupportErrorInfo");
	pCListBox->OutputRelease((IUnknown**)&m_pIConnectionPointContainer, "IConnectionPointContainer");

	//Enumerator interfaces
	pCListBox->OutputRelease((IUnknown**)&m_pISourcesRowset,			"ISourcesRowset");
	pCListBox->OutputRelease((IUnknown**)&m_pIParseDisplayName,			"IParseDisplayName");
	
	//Extra interfaces
	pCListBox->OutputRelease((IUnknown**)&m_pIConnectionPoint,			"IConnectionPoint");

	//Base
	ReleaseBase("DataSource");

	//Properties
	SAFE_FREE(m_pwszDataSource);
	SAFE_FREE(m_pwszDBMS);
	SAFE_FREE(m_pwszDBMSVer);
	SAFE_FREE(m_pwszProviderName);
	SAFE_FREE(m_pwszProviderDesc);

	//Data
	m_fConnected = FALSE;
	return S_OK;
}


/////////////////////////////////////////////////////////////////
// BOOL CDataSource::IsConnected
//
/////////////////////////////////////////////////////////////////
BOOL CDataSource::IsConnected()
{
	return m_fConnected;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::CreateDataSource
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::CreateDataSource(CDataSource* pCDataSource)
{
	//Use exsiting Connection
	ASSERT(pCDataSource);
	HRESULT				hr = S_OK;
	HRESULT				hrOptional = S_OK;
	HWND hWnd = m_pCMDIChild->m_hWnd;
	CListBox* pCListBox = m_pCMDIChild->m_pCListBox;

	//Release all Previous interfaces...
	IUnknown* pIUnknown = pCDataSource->m_pIUnknown;
	pCListBox->OutputAddRef(pIUnknown);
	ReleaseDataSource();
	m_pIUnknown = pIUnknown;

	//Determine the Type of this Object...
	hrOptional = pCListBox->OutputQI(m_pIUnknown,	IID_IParseDisplayName,	(IUnknown**)&m_pIParseDisplayName);
		
	//DataSource
	if(m_pIParseDisplayName == NULL)
	{
		//[MANDATORY]
		if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_SETPROPERTIES || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
			XTEST(hWnd, hr = pCListBox->OutputQI(m_pIUnknown,	IID_IDBProperties,				(IUnknown**)&m_pIDBProperties));

		if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_INITIALIZE	|| m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
			XTESTC(hWnd, hr = pCListBox->OutputQI(m_pIUnknown,	IID_IDBInitialize,				(IUnknown**)&m_pIDBInitialize));
		
		if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_CREATESESSION || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IDBCreateSession,			(IUnknown**)&m_pIDBCreateSession);

		//AutoQI
		if(GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
		{
			//[OPTIONAL]
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IPersist,					(IUnknown**)&m_pIPersist);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IConnectionPointContainer,	(IUnknown**)&m_pIConnectionPointContainer);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IDBAsynchStatus,			(IUnknown**)&m_pIDBAsynchStatus);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IDBDataSourceAdmin,			(IUnknown**)&m_pIDBDataSourceAdmin);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IDBInfo,					(IUnknown**)&m_pIDBInfo);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_IPersistFile,				(IUnknown**)&m_pIPersistFile);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,		IID_ISupportErrorInfo,			(IUnknown**)&m_pISupportErrorInfo);
		}

		//DBPROP_DATASOURCENAME
		GetProperty(m_pIUnknown, DBPROP_DATASOURCENAME,			DBPROPSET_DATASOURCEINFO, &m_pwszDataSource);
		//DBPROP_DBMSNAME
		GetProperty(m_pIUnknown, DBPROP_DBMSNAME,				DBPROPSET_DATASOURCEINFO, &m_pwszDBMS);
		//DBPROP_DBMSVER
		GetProperty(m_pIUnknown, DBPROP_DBMSVER,				DBPROPSET_DATASOURCEINFO, &m_pwszDBMSVer);
		//DBPROP_PROVIDERFILENAME
		GetProperty(m_pIUnknown, DBPROP_PROVIDERFILENAME,		DBPROPSET_DATASOURCEINFO, &m_pwszProviderName);
		//DBPROP_PROVIDERFRIENDLYNAME
		GetProperty(m_pIUnknown, DBPROP_PROVIDERFRIENDLYNAME,	DBPROPSET_DATASOURCEINFO, &m_pwszProviderDesc);
	}
	else //Enumerator
	{
		//AutoQI
		if(GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
		{
			//[MANDATORY]
			XTESTC(hWnd, hr = pCListBox->OutputQI(m_pIUnknown,	IID_ISourcesRowset,		(IUnknown**)&m_pISourcesRowset));
			
			//[OPTIONAL]
			hrOptional = pCListBox->OutputQI(m_pIUnknown,	IID_IDBInitialize,			(IUnknown**)&m_pIDBInitialize);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,	IID_IDBProperties,			(IUnknown**)&m_pIDBProperties);
			hrOptional = pCListBox->OutputQI(m_pIUnknown,	IID_ISupportErrorInfo,		(IUnknown**)&m_pISupportErrorInfo);
		}
	}

	//Copy EnumInfo
	memcpy(&m_EnumInfo, &pCDataSource->m_EnumInfo, sizeof(ENUMINFO));

CLEANUP:
	return hr;
}


/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::AdviseListeners
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -