📄 oleasmon.cpp
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFX_OLE_SEG
#pragma code_seg(AFX_OLE_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
#pragma inline_depth(0)
/////////////////////////////////////////////////////////////////////////////
// _AfxBindStatusCallback for CAsyncMonikerFile implementation
class _AfxBindStatusCallback: public IBindStatusCallback
{
private:
class CInnerUnknown : public IUnknown
{
protected:
_AfxBindStatusCallback* m_pThis;
friend class _AfxBindStatusCallback;
public:
inline CInnerUnknown() { }
inline void SetpThis(_AfxBindStatusCallback* pThis) { ASSERT(pThis != NULL); m_pThis = pThis; }
STDMETHOD_(ULONG, AddRef)()
{
return InterlockedIncrement((long*)&m_pThis->m_dwRef);
}
STDMETHOD_(ULONG, Release)()
{
unsigned long lResult = InterlockedDecrement((long*)&m_pThis->m_dwRef);
if (lResult == 0)
delete m_pThis;
return lResult;
}
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject)
{
if (!ppvObject)
return E_POINTER;
// check for the interfaces this object knows about
if (iid == IID_IUnknown)
{
*ppvObject = (IUnknown*)this;
AddRef();
return S_OK;
}
if (iid == IID_IBindStatusCallback)
{
*ppvObject = (IBindStatusCallback*)m_pThis;
m_pThis->AddRef();
return S_OK;
}
// otherwise, incorrect IID, and thus error
return E_NOINTERFACE;
}
};
public:
inline _AfxBindStatusCallback(CAsyncMonikerFile* pOwner, IUnknown* pUnkControlling)
: m_pOwner(pOwner), m_dwRef(0)
{
m_UnkInner.SetpThis(this);
ASSERT(pOwner);
#ifdef _AFXDLL
m_pModuleState = AfxGetModuleState();
ASSERT(m_pModuleState != NULL);
#endif
m_pUnkControlling = pUnkControlling ? pUnkControlling : (IUnknown*)&m_UnkInner;
AfxOleLockApp();
}
inline ~_AfxBindStatusCallback()
{
AFX_MANAGE_STATE(m_pModuleState);
AfxOleUnlockApp();
}
inline void Orphan() { m_pOwner = NULL; }
STDMETHOD_(ULONG, AddRef)()
{ return m_pUnkControlling->AddRef(); }
STDMETHOD_(ULONG, Release)()
{ return m_pUnkControlling->Release(); }
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject)
{ return m_pUnkControlling->QueryInterface(iid, ppvObject); }
const CAsyncMonikerFile* GetOwner() const{ return m_pOwner; }
DWORD GetRefcount() const { return m_dwRef; }
const IUnknown* GetControllingUnknown() const { return m_pUnkControlling; }
IUnknown* GetControllingUnknown() { return m_pUnkControlling; }
const IUnknown* GetInnerUnknown() const { return &m_UnkInner; }
IUnknown* GetInnerUnknown() { return &m_UnkInner; }
const _AfxBindStatusCallback* GetpThisOfInnerUnknown() const { return m_UnkInner.m_pThis; }
#ifdef _AFXDLL
const AFX_MODULE_STATE* GetModuleState() const { return m_pModuleState; }
#endif
protected:
friend class CInnerUnknown;
DWORD m_dwRef;
private:
IUnknown* m_pUnkControlling;
CInnerUnknown m_UnkInner;
CAsyncMonikerFile* m_pOwner;
#ifdef _AFXDLL
AFX_MODULE_STATE* m_pModuleState;
#endif
STDMETHOD(GetBindInfo)(
DWORD __RPC_FAR *pgrfBINDF, BINDINFO __RPC_FAR *pbindinfo)
{
ASSERT(m_pOwner);
if (!pgrfBINDF || !pbindinfo)
return E_POINTER;
if (pbindinfo->cbSize<sizeof(BINDINFO))
return E_INVALIDARG;
if (!m_pOwner)
return E_FAIL;
AFX_MANAGE_STATE(m_pModuleState);
pbindinfo->szExtraInfo = NULL;
TRY
{
*pgrfBINDF = m_pOwner->GetBindInfo();
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(OnStartBinding)(
DWORD dwReserved, IBinding __RPC_FAR *pBinding)
{
ASSERT(m_pOwner);
UNUSED_ALWAYS(dwReserved);
if (!pBinding)
return E_POINTER;
if (!m_pOwner)
return E_FAIL;
AFX_MANAGE_STATE(m_pModuleState);
TRY
{
m_pOwner->SetBinding(pBinding);
m_pOwner->OnStartBinding();
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(GetPriority)(LONG __RPC_FAR *pnPriority)
{
ASSERT(m_pOwner);
if (!pnPriority)
return E_POINTER;
if (!m_pOwner)
return E_FAIL;
AFX_MANAGE_STATE(m_pModuleState);
TRY
{
*pnPriority = m_pOwner->GetPriority();
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(OnProgress)(
ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode,
LPCOLESTR szStatusText)
{
ASSERT(m_pOwner);
if (!m_pOwner)
return E_FAIL;
USES_CONVERSION;
AFX_MANAGE_STATE(m_pModuleState);
TRY
{
m_pOwner->OnProgress(ulProgress, ulProgressMax, ulStatusCode, OLE2CT(szStatusText));
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(OnDataAvailable)(
DWORD grfBSCF, DWORD dwSize, FORMATETC __RPC_FAR *pformatetc,
STGMEDIUM __RPC_FAR *pstgmed)
{
ASSERT(m_pOwner);
if (!m_pOwner)
return E_FAIL;
AFX_MANAGE_STATE(m_pModuleState);
TRY
{
m_pOwner->SetFormatEtc(pformatetc);
if (grfBSCF&BSCF_FIRSTDATANOTIFICATION)
{
if (!pstgmed || !pformatetc)
return E_POINTER;
if ((pstgmed->tymed != TYMED_ISTREAM) ||
!pstgmed->pstm)
return E_UNEXPECTED;
ASSERT(!m_pOwner->GetStream());
m_pOwner->COleStreamFile::Attach(pstgmed->pstm);
pstgmed->pstm->AddRef();
}
m_pOwner->OnDataAvailable(dwSize, grfBSCF);
}
CATCH_ALL(e)
{
m_pOwner->SetFormatEtc(NULL);
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
m_pOwner->SetFormatEtc(NULL);
return S_OK;
}
STDMETHOD(OnLowResource)(DWORD dwReserved)
{
ASSERT(m_pOwner);
if (!m_pOwner)
return E_FAIL;
AFX_MANAGE_STATE(m_pModuleState);
UNUSED_ALWAYS(dwReserved);
TRY
{
m_pOwner->OnLowResource();
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCOLESTR szError)
{
//Does not ASSERT(m_pOwner) because this can be called
//after it has been Orphan()ed.
if (!m_pOwner)
return E_FAIL;
USES_CONVERSION;
AFX_MANAGE_STATE(m_pModuleState);
ASSERT(m_pOwner->GetBinding());
TRY
{
m_pOwner->m_bStopBindingReceived = TRUE;
m_pOwner->OnStopBinding(hresult, OLE2CT(szError));
if (m_pOwner)
{
// Calling EndCallbacks will result in a inner Release. Our
// caller has an inner refcount on us, possibly through the
// controlling unknown, and we have an inner refcount from
// m_pOwner, so m_dwRef > 1 and it's safe to call EndCallbacks.
ASSERT(m_dwRef > 1);
m_pOwner->EndCallbacks();
}
}
CATCH_ALL(e)
{
HRESULT hr = ResultFromScode(COleException::Process(e));
DELETE_EXCEPTION(e);
return hr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -