📄 oleasmon.cpp
字号:
}
END_CATCH_ALL
return S_OK;
}
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown __RPC_FAR *punk)
{
#ifdef _DEBUG
AFX_MANAGE_STATE(m_pModuleState);
ASSERT(FALSE); // This function should never be called.
#endif //_DEBUG
UNUSED_ALWAYS(riid);
UNUSED_ALWAYS(punk);
return E_UNEXPECTED;
}
};
/////////////////////////////////////////////////////////////////////////////
// Helper functions for CAsyncMonikerFile implementation
AFX_STATIC inline IBindHost* AFXAPI _AfxTrySPForBindHost(IServiceProvider* pServiceProvider)
{
ASSERT(pServiceProvider);
IBindHost* pBindHost;
HRESULT hr=pServiceProvider->QueryService(SID_IBindHost, IID_IBindHost,
(void**)&pBindHost);
if (SUCCEEDED(hr))
return pBindHost;
else
return NULL;
}
AFX_STATIC inline IBindHost* AFXAPI _AfxTryQIForBindHost(IUnknown* pUnk)
{
ASSERT(pUnk);
IPTR(IBindHost) pBindHost;
HRESULT hr = pBindHost.QueryInterface(pUnk);
if (SUCCEEDED(hr))
return pBindHost;
else
return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CAsyncMonikerFile implementation
CAsyncMonikerFile::CAsyncMonikerFile() : m_pFormatEtc(NULL),
m_pAfxBSCCurrent(NULL)
{
}
CAsyncMonikerFile::~CAsyncMonikerFile()
{
CAsyncMonikerFile::Close();
}
void CAsyncMonikerFile::EndCallbacks()
{
if (m_pAfxBSCCurrent)
{
m_pAfxBSCCurrent->Orphan();
IUnknown* pUnkInner = m_pAfxBSCCurrent->GetInnerUnknown();
ASSERT(pUnkInner != NULL);
pUnkInner->Release();
m_pAfxBSCCurrent = NULL;
}
}
UINT CAsyncMonikerFile::Read(void* lpBuf, UINT nCount)
{
ASSERT_VALID(this);
ASSERT(m_lpStream != NULL);
DWORD dwBytesRead;
HRESULT hr = _AfxReadFromStream(m_lpStream, lpBuf, nCount, dwBytesRead);
if ((hr != S_OK) && (hr != S_ASYNCHRONOUS) && (hr != E_PENDING))
_AfxThrowOleFileException(hr);
// always return number of bytes read
return (UINT)dwBytesRead;
}
void CAsyncMonikerFile::Close()
{
ASSERT_VALID(this);
if (m_Binding.GetInterfacePtr())
{
if (!m_bStopBindingReceived)
m_Binding->Abort();
m_Binding.Release();
}
EndCallbacks();
CMonikerFile::Close();
}
BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker, IBindHost* pBindHost, CFileException* pError)
{
if (!pBindHost)
return CAsyncMonikerFile::Open(pMoniker, pError);
Close();
IPTR(IBindCtx) pBindCtx(CreateBindContext(pError), FALSE);
if (pError && (pError->m_cause != CFileException::none))
return FALSE;
IPTR(IUnknown) pBSCUnk(CreateBindStatusCallback(NULL), FALSE);
IPTR(IBindStatusCallback) pBSC;
pBSC.QueryInterface(pBSCUnk);
m_bStopBindingReceived = FALSE;
return Attach(pMoniker, pBindHost, pBSC, pBindCtx, pError);
}
BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL, IBindHost* pBindHost, CFileException* pError)
{
if (!pBindHost)
return CAsyncMonikerFile::Open(lpszURL, pError);
Close();
IPTR(IBindCtx) pBindCtx(CreateBindContext(pError), FALSE);
if (pError && (pError->m_cause != CFileException::none))
return FALSE;
IPTR(IUnknown) pBSCUnk(CreateBindStatusCallback(NULL), FALSE);
IPTR(IBindStatusCallback) pBSC;
pBSC.QueryInterface(pBSCUnk);
m_bStopBindingReceived = FALSE;
return Attach(lpszURL, pBindHost, pBSC, pBindCtx, pError);
}
BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL, CFileException* pError)
{
IPTR(IBindHost) pBindHost(CreateBindHost(), FALSE);
return Open(lpszURL, static_cast<IBindHost*>(pBindHost), pError);
}
BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker, CFileException* pError)
{
IPTR(IBindHost) pBindHost(CreateBindHost(), FALSE);
return Open(pMoniker, (IBindHost*)pBindHost, pError);
}
BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL,
IServiceProvider* pServiceProvider, CFileException* pError)
{
if (!pServiceProvider)
return CAsyncMonikerFile::Open(lpszURL, pError);
IPTR(IBindHost) pBindHost;
pBindHost = _AfxTrySPForBindHost(pServiceProvider);
if (!pBindHost.GetInterfacePtr())
pBindHost = _AfxTryQIForBindHost(pServiceProvider);
if (pBindHost.GetInterfacePtr())
return Open(lpszURL, (IBindHost*)pBindHost, pError);
return CAsyncMonikerFile::Open(lpszURL, pError);
}
BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL,
IUnknown* pUnknown, CFileException* pError)
{
if (!pUnknown)
return CAsyncMonikerFile::Open(lpszURL, pError);
IPTR(IBindHost) pBindHost;
IPTR(IServiceProvider) pServiceProvider;
HRESULT hr=pServiceProvider.QueryInterface(pUnknown);
if (SUCCEEDED(hr) && pServiceProvider.GetInterfacePtr())
pBindHost = _AfxTrySPForBindHost(pServiceProvider);
if (!pBindHost.GetInterfacePtr())
pBindHost = _AfxTryQIForBindHost(pUnknown);
if (pBindHost.GetInterfacePtr())
return Open(lpszURL, (IBindHost*)pBindHost, pError);
return CAsyncMonikerFile::Open(lpszURL, pError);
}
BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker,
IServiceProvider* pServiceProvider, CFileException* pError)
{
if (!pServiceProvider)
return Open(pMoniker, pError);
IPTR(IBindHost) pBindHost;
pBindHost = _AfxTrySPForBindHost(pServiceProvider);
if (!pBindHost.GetInterfacePtr())
pBindHost = _AfxTryQIForBindHost(pServiceProvider);
if (pBindHost.GetInterfacePtr())
return Open(pMoniker, (IBindHost*)pBindHost, pError);
return Open(pMoniker, pError);
}
BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker,
IUnknown* pUnknown, CFileException* pError)
{
if (!pUnknown)
return Open(pMoniker, pError);
IPTR(IBindHost) pBindHost;
IPTR(IServiceProvider) pServiceProvider;
HRESULT hr=pServiceProvider.QueryInterface(pUnknown);
if (SUCCEEDED(hr) && pServiceProvider.GetInterfacePtr())
pBindHost = _AfxTrySPForBindHost(pServiceProvider);
if (!pBindHost.GetInterfacePtr())
pBindHost = _AfxTryQIForBindHost(pServiceProvider);
if (pBindHost.GetInterfacePtr())
return Open(pMoniker, (IBindHost*)pBindHost, pError);
return Open(pMoniker, pError);
}
BOOL CAsyncMonikerFile::PostBindToStream(CFileException* pError)
{
if (S_OK == IsAsyncMoniker(GetMoniker()))
return TRUE;
return CMonikerFile::PostBindToStream(pError);
}
IUnknown* CAsyncMonikerFile::CreateBindStatusCallback(IUnknown* pUnkControlling)
{
ASSERT(NULL == m_pAfxBSCCurrent); // Set by Close()
m_pAfxBSCCurrent = new _AfxBindStatusCallback(this, pUnkControlling);
IUnknown* pUnkInner = m_pAfxBSCCurrent->GetInnerUnknown();
ASSERT(pUnkInner != NULL);
//Reference inner unknown for m_pAfxBSCCurrent
pUnkInner->AddRef();
//Reference inner unknown for return value.
pUnkInner->AddRef();
return pUnkInner;
}
DWORD CAsyncMonikerFile::GetBindInfo() const
{
return BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE;
}
LONG CAsyncMonikerFile::GetPriority() const
{
return THREAD_PRIORITY_NORMAL;
}
void CAsyncMonikerFile::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
UNUSED_ALWAYS(dwSize);
UNUSED_ALWAYS(bscfFlag);
}
void CAsyncMonikerFile::OnLowResource()
{
}
void CAsyncMonikerFile::OnStartBinding()
{
}
void CAsyncMonikerFile::OnStopBinding(HRESULT hresult, LPCTSTR szError)
{
UNUSED_ALWAYS(hresult);
UNUSED_ALWAYS(szError);
}
void CAsyncMonikerFile::OnProgress(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCTSTR szStatusText)
{
UNUSED_ALWAYS(ulProgress);
UNUSED_ALWAYS(ulProgressMax);
UNUSED_ALWAYS(ulStatusCode);
UNUSED_ALWAYS(szStatusText);
}
/////////////////////////////////////////////////////////////////////////////
// CAsyncMonikerFile diagnostics
#ifdef _DEBUG
void CAsyncMonikerFile::AssertValid() const
{
if (m_pAfxBSCCurrent)
{
ASSERT(m_pAfxBSCCurrent->GetOwner() == this);
ASSERT(m_pAfxBSCCurrent->GetRefcount() > 0);
#ifdef _AFXDLL
ASSERT(m_pAfxBSCCurrent->GetModuleState() == AfxGetModuleState());
#endif
ASSERT(m_pAfxBSCCurrent->GetpThisOfInnerUnknown() == m_pAfxBSCCurrent);
}
CMonikerFile::AssertValid();
}
void CAsyncMonikerFile::Dump(CDumpContext& dc) const
{
CMonikerFile::Dump(dc);
dc << "\nm_Binding = " << m_Binding.GetInterfacePtr();
dc << "\nm_pFormatEtc = " << m_pFormatEtc;
dc << "\nm_pAfxBSCCurrent = " << m_pAfxBSCCurrent;
if (m_pAfxBSCCurrent)
{
dc << "\nm_pAfxBSCCurrent->GetOwner() = " << m_pAfxBSCCurrent->GetOwner();
dc << "\nm_pAfxBSCCurrent->GetRefcount() = " << m_pAfxBSCCurrent->GetRefcount();
dc << "\nm_pAfxBSCCurrent->GetControllingUnknown() = " << m_pAfxBSCCurrent->GetControllingUnknown();
dc << "\nm_pAfxBSCCurrent->GetInnerUnknown() = " << m_pAfxBSCCurrent->GetInnerUnknown();
dc << "\nm_pAfxBSCCurrent->GetpThisOfInnerUnknown() = " << m_pAfxBSCCurrent->GetpThisOfInnerUnknown();
#ifdef _AFXDLL
dc << "\nm_pAfxBSCCurrent->GetModuleState() = " << m_pAfxBSCCurrent->GetModuleState();
#endif
}
dc << "\n";
}
#endif
////////////////////////////////////////////////////////////////////////////
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CAsyncMonikerFile, CMonikerFile)
////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -