oleasmon.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_OLE_SEG
  12. #pragma code_seg(AFX_OLE_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. #pragma inline_depth(0)
  20. /////////////////////////////////////////////////////////////////////////////
  21. // _AfxBindStatusCallback for CAsyncMonikerFile implementation
  22. class _AfxBindStatusCallback: public IBindStatusCallback
  23. {
  24. private:
  25. class CInnerUnknown : public IUnknown
  26. {
  27. protected:
  28. _AfxBindStatusCallback* m_pThis;
  29. friend class _AfxBindStatusCallback;
  30. public:
  31. inline CInnerUnknown() { }
  32. inline void SetpThis(_AfxBindStatusCallback* pThis) { ASSERT(pThis != NULL); m_pThis = pThis; }
  33. STDMETHOD_(ULONG, AddRef)()
  34. {
  35. return InterlockedIncrement((long*)&m_pThis->m_dwRef);
  36. }
  37. STDMETHOD_(ULONG, Release)()
  38. {
  39. unsigned long lResult = InterlockedDecrement((long*)&m_pThis->m_dwRef);
  40. if (lResult == 0)
  41. delete m_pThis;
  42. return lResult;
  43. }
  44. STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject)
  45. {
  46. if (!ppvObject)
  47. return E_POINTER;
  48. // check for the interfaces this object knows about
  49. if (iid == IID_IUnknown)
  50. {
  51. *ppvObject = (IUnknown*)this;
  52. AddRef();
  53. return S_OK;
  54. }
  55. if (iid == IID_IBindStatusCallback)
  56. {
  57. *ppvObject = (IBindStatusCallback*)m_pThis;
  58. m_pThis->AddRef();
  59. return S_OK;
  60. }
  61. // otherwise, incorrect IID, and thus error
  62. return E_NOINTERFACE;
  63. }
  64. };
  65. public:
  66. inline _AfxBindStatusCallback(CAsyncMonikerFile* pOwner, IUnknown* pUnkControlling)
  67. : m_pOwner(pOwner), m_dwRef(0)
  68. {
  69. m_UnkInner.SetpThis(this);
  70. ASSERT(pOwner);
  71. #ifdef _AFXDLL
  72. m_pModuleState = AfxGetModuleState();
  73. ASSERT(m_pModuleState != NULL);
  74. #endif
  75. m_pUnkControlling = pUnkControlling ? pUnkControlling : (IUnknown*)&m_UnkInner;
  76. AfxOleLockApp();
  77. }
  78. inline ~_AfxBindStatusCallback()
  79. {
  80. AFX_MANAGE_STATE(m_pModuleState);
  81. AfxOleUnlockApp();
  82. }
  83. inline void Orphan() { m_pOwner = NULL; }
  84. STDMETHOD_(ULONG, AddRef)()
  85. { return m_pUnkControlling->AddRef(); }
  86. STDMETHOD_(ULONG, Release)()
  87. { return m_pUnkControlling->Release(); }
  88. STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject)
  89. { return m_pUnkControlling->QueryInterface(iid, ppvObject); }
  90. const CAsyncMonikerFile* GetOwner() const{ return m_pOwner; }
  91. DWORD GetRefcount() const { return m_dwRef; }
  92. const IUnknown* GetControllingUnknown() const { return m_pUnkControlling; }
  93. IUnknown* GetControllingUnknown() { return m_pUnkControlling; }
  94. const IUnknown* GetInnerUnknown() const { return &m_UnkInner; }
  95. IUnknown* GetInnerUnknown() { return &m_UnkInner; }
  96. const _AfxBindStatusCallback* GetpThisOfInnerUnknown() const { return m_UnkInner.m_pThis; }
  97. #ifdef _AFXDLL
  98. const AFX_MODULE_STATE* GetModuleState() const { return m_pModuleState; }
  99. #endif
  100. protected:
  101. friend class CInnerUnknown;
  102. DWORD m_dwRef;
  103. private:
  104. IUnknown* m_pUnkControlling;
  105. CInnerUnknown m_UnkInner;
  106. CAsyncMonikerFile* m_pOwner;
  107. #ifdef _AFXDLL
  108. AFX_MODULE_STATE* m_pModuleState;
  109. #endif
  110. STDMETHOD(GetBindInfo)(
  111. DWORD __RPC_FAR *pgrfBINDF, BINDINFO __RPC_FAR *pbindinfo)
  112. {
  113. ASSERT(m_pOwner);
  114. if (!pgrfBINDF || !pbindinfo)
  115. return E_POINTER;
  116. if (pbindinfo->cbSize<sizeof(BINDINFO))
  117. return E_INVALIDARG;
  118. if (!m_pOwner)
  119. return E_FAIL;
  120. AFX_MANAGE_STATE(m_pModuleState);
  121. pbindinfo->szExtraInfo = NULL;
  122. TRY
  123. {
  124. *pgrfBINDF = m_pOwner->GetBindInfo();
  125. }
  126. CATCH_ALL(e)
  127. {
  128. HRESULT hr = ResultFromScode(COleException::Process(e));
  129. DELETE_EXCEPTION(e);
  130. return hr;
  131. }
  132. END_CATCH_ALL
  133. return S_OK;
  134. }
  135. STDMETHOD(OnStartBinding)(
  136. DWORD dwReserved, IBinding __RPC_FAR *pBinding)
  137. {
  138. ASSERT(m_pOwner);
  139. UNUSED_ALWAYS(dwReserved);
  140. if (!pBinding)
  141. return E_POINTER;
  142. if (!m_pOwner)
  143. return E_FAIL;
  144. AFX_MANAGE_STATE(m_pModuleState);
  145. TRY
  146. {
  147. m_pOwner->SetBinding(pBinding);
  148. m_pOwner->OnStartBinding();
  149. }
  150. CATCH_ALL(e)
  151. {
  152. HRESULT hr = ResultFromScode(COleException::Process(e));
  153. DELETE_EXCEPTION(e);
  154. return hr;
  155. }
  156. END_CATCH_ALL
  157. return S_OK;
  158. }
  159. STDMETHOD(GetPriority)(LONG __RPC_FAR *pnPriority)
  160. {
  161. ASSERT(m_pOwner);
  162. if (!pnPriority)
  163. return E_POINTER;
  164. if (!m_pOwner)
  165. return E_FAIL;
  166. AFX_MANAGE_STATE(m_pModuleState);
  167. TRY
  168. {
  169. *pnPriority = m_pOwner->GetPriority();
  170. }
  171. CATCH_ALL(e)
  172. {
  173. HRESULT hr = ResultFromScode(COleException::Process(e));
  174. DELETE_EXCEPTION(e);
  175. return hr;
  176. }
  177. END_CATCH_ALL
  178. return S_OK;
  179. }
  180. STDMETHOD(OnProgress)(
  181. ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode,
  182. LPCOLESTR szStatusText)
  183. {
  184. ASSERT(m_pOwner);
  185. if (!m_pOwner)
  186. return E_FAIL;
  187. USES_CONVERSION;
  188. AFX_MANAGE_STATE(m_pModuleState);
  189. TRY
  190. {
  191. m_pOwner->OnProgress(ulProgress, ulProgressMax, ulStatusCode, OLE2CT(szStatusText));
  192. }
  193. CATCH_ALL(e)
  194. {
  195. HRESULT hr = ResultFromScode(COleException::Process(e));
  196. DELETE_EXCEPTION(e);
  197. return hr;
  198. }
  199. END_CATCH_ALL
  200. return S_OK;
  201. }
  202. STDMETHOD(OnDataAvailable)(
  203. DWORD grfBSCF, DWORD dwSize, FORMATETC __RPC_FAR *pformatetc,
  204. STGMEDIUM __RPC_FAR *pstgmed)
  205. {
  206. ASSERT(m_pOwner);
  207. if (!m_pOwner)
  208. return E_FAIL;
  209. AFX_MANAGE_STATE(m_pModuleState);
  210. TRY
  211. {
  212. m_pOwner->SetFormatEtc(pformatetc);
  213. if (grfBSCF&BSCF_FIRSTDATANOTIFICATION)
  214. {
  215. if (!pstgmed || !pformatetc)
  216. return E_POINTER;
  217. if ((pstgmed->tymed != TYMED_ISTREAM) ||
  218. !pstgmed->pstm)
  219. return E_UNEXPECTED;
  220. ASSERT(!m_pOwner->GetStream());
  221. m_pOwner->COleStreamFile::Attach(pstgmed->pstm);
  222. pstgmed->pstm->AddRef();
  223. }
  224. m_pOwner->OnDataAvailable(dwSize, grfBSCF);
  225. }
  226. CATCH_ALL(e)
  227. {
  228. m_pOwner->SetFormatEtc(NULL);
  229. HRESULT hr = ResultFromScode(COleException::Process(e));
  230. DELETE_EXCEPTION(e);
  231. return hr;
  232. }
  233. END_CATCH_ALL
  234. m_pOwner->SetFormatEtc(NULL);
  235. return S_OK;
  236. }
  237. STDMETHOD(OnLowResource)(DWORD dwReserved)
  238. {
  239. ASSERT(m_pOwner);
  240. if (!m_pOwner)
  241. return E_FAIL;
  242. AFX_MANAGE_STATE(m_pModuleState);
  243. UNUSED_ALWAYS(dwReserved);
  244. TRY
  245. {
  246. m_pOwner->OnLowResource();
  247. }
  248. CATCH_ALL(e)
  249. {
  250. HRESULT hr = ResultFromScode(COleException::Process(e));
  251. DELETE_EXCEPTION(e);
  252. return hr;
  253. }
  254. END_CATCH_ALL
  255. return S_OK;
  256. }
  257. STDMETHOD(OnStopBinding)(HRESULT hresult, LPCOLESTR szError)
  258. {
  259. //Does not ASSERT(m_pOwner) because this can be called
  260. //after it has been Orphan()ed.
  261. if (!m_pOwner)
  262. return E_FAIL;
  263. USES_CONVERSION;
  264. AFX_MANAGE_STATE(m_pModuleState);
  265. ASSERT(m_pOwner->GetBinding());
  266. TRY
  267. {
  268. m_pOwner->m_bStopBindingReceived = TRUE;
  269. m_pOwner->OnStopBinding(hresult, OLE2CT(szError));
  270. if (m_pOwner)
  271. {
  272. // Calling EndCallbacks will result in a inner Release. Our
  273. // caller has an inner refcount on us, possibly through the
  274. // controlling unknown, and we have an inner refcount from
  275. // m_pOwner, so m_dwRef > 1 and it's safe to call EndCallbacks.
  276. ASSERT(m_dwRef > 1);
  277. m_pOwner->EndCallbacks();
  278. }
  279. }
  280. CATCH_ALL(e)
  281. {
  282. HRESULT hr = ResultFromScode(COleException::Process(e));
  283. DELETE_EXCEPTION(e);
  284. return hr;
  285. }
  286. END_CATCH_ALL
  287. return S_OK;
  288. }
  289. STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown __RPC_FAR *punk)
  290. {
  291. #ifdef _DEBUG
  292. AFX_MANAGE_STATE(m_pModuleState);
  293. ASSERT(FALSE); // This function should never be called.
  294. #endif //_DEBUG
  295. UNUSED_ALWAYS(riid);
  296. UNUSED_ALWAYS(punk);
  297. return E_UNEXPECTED;
  298. }
  299. };
  300. /////////////////////////////////////////////////////////////////////////////
  301. // Helper functions for CAsyncMonikerFile implementation
  302. AFX_STATIC inline IBindHost* AFXAPI _AfxTrySPForBindHost(IServiceProvider* pServiceProvider)
  303. {
  304. ASSERT(pServiceProvider);
  305. IBindHost* pBindHost;
  306. HRESULT hr=pServiceProvider->QueryService(SID_IBindHost, IID_IBindHost,
  307. (void**)&pBindHost);
  308. if (SUCCEEDED(hr))
  309. return pBindHost;
  310. else
  311. return NULL;
  312. }
  313. AFX_STATIC inline IBindHost* AFXAPI _AfxTryQIForBindHost(IUnknown* pUnk)
  314. {
  315. ASSERT(pUnk);
  316. IPTR(IBindHost) pBindHost;
  317. HRESULT hr = pBindHost.QueryInterface(pUnk);
  318. if (SUCCEEDED(hr))
  319. return pBindHost;
  320. else
  321. return NULL;
  322. }
  323. /////////////////////////////////////////////////////////////////////////////
  324. // CAsyncMonikerFile implementation
  325. CAsyncMonikerFile::CAsyncMonikerFile() : m_pFormatEtc(NULL),
  326. m_pAfxBSCCurrent(NULL)
  327. {
  328. }
  329. CAsyncMonikerFile::~CAsyncMonikerFile()
  330. {
  331. CAsyncMonikerFile::Close();
  332. }
  333. void CAsyncMonikerFile::EndCallbacks()
  334. {
  335. if (m_pAfxBSCCurrent)
  336. {
  337. m_pAfxBSCCurrent->Orphan();
  338. IUnknown* pUnkInner = m_pAfxBSCCurrent->GetInnerUnknown();
  339. ASSERT(pUnkInner != NULL);
  340. pUnkInner->Release();
  341. m_pAfxBSCCurrent = NULL;
  342. }
  343. }
  344. UINT CAsyncMonikerFile::Read(void* lpBuf, UINT nCount)
  345. {
  346. ASSERT_VALID(this);
  347. ASSERT(m_lpStream != NULL);
  348. DWORD dwBytesRead;
  349. HRESULT hr = _AfxReadFromStream(m_lpStream, lpBuf, nCount, dwBytesRead);
  350. if ((hr != S_OK) && (hr != S_ASYNCHRONOUS) && (hr != E_PENDING))
  351. _AfxThrowOleFileException(hr);
  352. // always return number of bytes read
  353. return (UINT)dwBytesRead;
  354. }
  355. void CAsyncMonikerFile::Close()
  356. {
  357. ASSERT_VALID(this);
  358. if (m_Binding.GetInterfacePtr())
  359. {
  360. if (!m_bStopBindingReceived)
  361. m_Binding->Abort();
  362. m_Binding.Release();
  363. }
  364. EndCallbacks();
  365. CMonikerFile::Close();
  366. }
  367. BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker, IBindHost* pBindHost, CFileException* pError)
  368. {
  369. if (!pBindHost)
  370. return CAsyncMonikerFile::Open(pMoniker, pError);
  371. Close();
  372. IPTR(IBindCtx) pBindCtx(CreateBindContext(pError), FALSE);
  373. if (pError && (pError->m_cause != CFileException::none))
  374. return FALSE;
  375. IPTR(IUnknown) pBSCUnk(CreateBindStatusCallback(NULL), FALSE);
  376. IPTR(IBindStatusCallback) pBSC;
  377. pBSC.QueryInterface(pBSCUnk);
  378. m_bStopBindingReceived = FALSE;
  379. return Attach(pMoniker, pBindHost, pBSC, pBindCtx, pError);
  380. }
  381. BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL, IBindHost* pBindHost, CFileException* pError)
  382. {
  383. if (!pBindHost)
  384. return CAsyncMonikerFile::Open(lpszURL, pError);
  385. Close();
  386. IPTR(IBindCtx) pBindCtx(CreateBindContext(pError), FALSE);
  387. if (pError && (pError->m_cause != CFileException::none))
  388. return FALSE;
  389. IPTR(IUnknown) pBSCUnk(CreateBindStatusCallback(NULL), FALSE);
  390. IPTR(IBindStatusCallback) pBSC;
  391. pBSC.QueryInterface(pBSCUnk);
  392. m_bStopBindingReceived = FALSE;
  393. return Attach(lpszURL, pBindHost, pBSC, pBindCtx, pError);
  394. }
  395. BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL, CFileException* pError)
  396. {
  397. IPTR(IBindHost) pBindHost(CreateBindHost(), FALSE);
  398. return Open(lpszURL, static_cast<IBindHost*>(pBindHost), pError);
  399. }
  400. BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker, CFileException* pError)
  401. {
  402. IPTR(IBindHost) pBindHost(CreateBindHost(), FALSE);
  403. return Open(pMoniker, (IBindHost*)pBindHost, pError);
  404. }
  405. BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL,
  406. IServiceProvider* pServiceProvider, CFileException* pError)
  407. {
  408. if (!pServiceProvider)
  409. return CAsyncMonikerFile::Open(lpszURL, pError);
  410. IPTR(IBindHost) pBindHost;
  411. pBindHost = _AfxTrySPForBindHost(pServiceProvider);
  412. if (!pBindHost.GetInterfacePtr())
  413. pBindHost = _AfxTryQIForBindHost(pServiceProvider);
  414. if (pBindHost.GetInterfacePtr())
  415. return Open(lpszURL, (IBindHost*)pBindHost, pError);
  416. return CAsyncMonikerFile::Open(lpszURL, pError);
  417. }
  418. BOOL CAsyncMonikerFile::Open(LPCTSTR lpszURL,
  419. IUnknown* pUnknown, CFileException* pError)
  420. {
  421. if (!pUnknown)
  422. return CAsyncMonikerFile::Open(lpszURL, pError);
  423. IPTR(IBindHost) pBindHost;
  424. IPTR(IServiceProvider) pServiceProvider;
  425. HRESULT hr=pServiceProvider.QueryInterface(pUnknown);
  426. if (SUCCEEDED(hr) && pServiceProvider.GetInterfacePtr())
  427. pBindHost = _AfxTrySPForBindHost(pServiceProvider);
  428. if (!pBindHost.GetInterfacePtr())
  429. pBindHost = _AfxTryQIForBindHost(pUnknown);
  430. if (pBindHost.GetInterfacePtr())
  431. return Open(lpszURL, (IBindHost*)pBindHost, pError);
  432. return CAsyncMonikerFile::Open(lpszURL, pError);
  433. }
  434. BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker,
  435. IServiceProvider* pServiceProvider, CFileException* pError)
  436. {
  437. if (!pServiceProvider)
  438. return Open(pMoniker, pError);
  439. IPTR(IBindHost) pBindHost;
  440. pBindHost = _AfxTrySPForBindHost(pServiceProvider);
  441. if (!pBindHost.GetInterfacePtr())
  442. pBindHost = _AfxTryQIForBindHost(pServiceProvider);
  443. if (pBindHost.GetInterfacePtr())
  444. return Open(pMoniker, (IBindHost*)pBindHost, pError);
  445. return Open(pMoniker, pError);
  446. }
  447. BOOL CAsyncMonikerFile::Open(IMoniker* pMoniker,
  448. IUnknown* pUnknown, CFileException* pError)
  449. {
  450. if (!pUnknown)
  451. return Open(pMoniker, pError);
  452. IPTR(IBindHost) pBindHost;
  453. IPTR(IServiceProvider) pServiceProvider;
  454. HRESULT hr=pServiceProvider.QueryInterface(pUnknown);
  455. if (SUCCEEDED(hr) && pServiceProvider.GetInterfacePtr())
  456. pBindHost = _AfxTrySPForBindHost(pServiceProvider);
  457. if (!pBindHost.GetInterfacePtr())
  458. pBindHost = _AfxTryQIForBindHost(pServiceProvider);
  459. if (pBindHost.GetInterfacePtr())
  460. return Open(pMoniker, (IBindHost*)pBindHost, pError);
  461. return Open(pMoniker, pError);
  462. }
  463. BOOL CAsyncMonikerFile::PostBindToStream(CFileException* pError)
  464. {
  465. if (S_OK == IsAsyncMoniker(GetMoniker()))
  466. return TRUE;
  467. return CMonikerFile::PostBindToStream(pError);
  468. }
  469. IUnknown* CAsyncMonikerFile::CreateBindStatusCallback(IUnknown* pUnkControlling)
  470. {
  471. ASSERT(NULL == m_pAfxBSCCurrent); // Set by Close()
  472. m_pAfxBSCCurrent = new _AfxBindStatusCallback(this, pUnkControlling);
  473. IUnknown* pUnkInner = m_pAfxBSCCurrent->GetInnerUnknown();
  474. ASSERT(pUnkInner != NULL);
  475. //Reference inner unknown for m_pAfxBSCCurrent
  476. pUnkInner->AddRef();
  477. //Reference inner unknown for return value.
  478. pUnkInner->AddRef();
  479. return pUnkInner;
  480. }
  481. DWORD CAsyncMonikerFile::GetBindInfo() const
  482. {
  483. return BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE;
  484. }
  485. LONG CAsyncMonikerFile::GetPriority() const
  486. {
  487. return THREAD_PRIORITY_NORMAL;
  488. }
  489. void CAsyncMonikerFile::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
  490. {
  491. UNUSED_ALWAYS(dwSize);
  492. UNUSED_ALWAYS(bscfFlag);
  493. }
  494. void CAsyncMonikerFile::OnLowResource()
  495. {
  496. }
  497. void CAsyncMonikerFile::OnStartBinding()
  498. {
  499. }
  500. void CAsyncMonikerFile::OnStopBinding(HRESULT hresult, LPCTSTR szError)
  501. {
  502. UNUSED_ALWAYS(hresult);
  503. UNUSED_ALWAYS(szError);
  504. }
  505. void CAsyncMonikerFile::OnProgress(ULONG ulProgress, ULONG ulProgressMax,
  506. ULONG ulStatusCode, LPCTSTR szStatusText)
  507. {
  508. UNUSED_ALWAYS(ulProgress);
  509. UNUSED_ALWAYS(ulProgressMax);
  510. UNUSED_ALWAYS(ulStatusCode);
  511. UNUSED_ALWAYS(szStatusText);
  512. }
  513. /////////////////////////////////////////////////////////////////////////////
  514. // CAsyncMonikerFile diagnostics
  515. #ifdef _DEBUG
  516. void CAsyncMonikerFile::AssertValid() const
  517. {
  518. if (m_pAfxBSCCurrent)
  519. {
  520. ASSERT(m_pAfxBSCCurrent->GetOwner() == this);
  521. ASSERT(m_pAfxBSCCurrent->GetRefcount() > 0);
  522. #ifdef _AFXDLL
  523. ASSERT(m_pAfxBSCCurrent->GetModuleState() == AfxGetModuleState());
  524. #endif
  525. ASSERT(m_pAfxBSCCurrent->GetpThisOfInnerUnknown() == m_pAfxBSCCurrent);
  526. }
  527. CMonikerFile::AssertValid();
  528. }
  529. void CAsyncMonikerFile::Dump(CDumpContext& dc) const
  530. {
  531. CMonikerFile::Dump(dc);
  532. dc << "\nm_Binding = " << m_Binding.GetInterfacePtr();
  533. dc << "\nm_pFormatEtc = " << m_pFormatEtc;
  534. dc << "\nm_pAfxBSCCurrent = " << m_pAfxBSCCurrent;
  535. if (m_pAfxBSCCurrent)
  536. {
  537. dc << "\nm_pAfxBSCCurrent->GetOwner() = " << m_pAfxBSCCurrent->GetOwner();
  538. dc << "\nm_pAfxBSCCurrent->GetRefcount() = " << m_pAfxBSCCurrent->GetRefcount();
  539. dc << "\nm_pAfxBSCCurrent->GetControllingUnknown() = " << m_pAfxBSCCurrent->GetControllingUnknown();
  540. dc << "\nm_pAfxBSCCurrent->GetInnerUnknown() = " << m_pAfxBSCCurrent->GetInnerUnknown();
  541. dc << "\nm_pAfxBSCCurrent->GetpThisOfInnerUnknown() = " << m_pAfxBSCCurrent->GetpThisOfInnerUnknown();
  542. #ifdef _AFXDLL
  543. dc << "\nm_pAfxBSCCurrent->GetModuleState() = " << m_pAfxBSCCurrent->GetModuleState();
  544. #endif
  545. }
  546. dc << "\n";
  547. }
  548. #endif
  549. ////////////////////////////////////////////////////////////////////////////
  550. #ifdef AFX_INIT_SEG
  551. #pragma code_seg(AFX_INIT_SEG)
  552. #endif
  553. IMPLEMENT_DYNAMIC(CAsyncMonikerFile, CMonikerFile)
  554. ////////////////////////////////////////////////////////////////////////////