occlock.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. #include "occimpl.h"
  12. #ifdef AFX_OCC_SEG
  13. #pragma code_seg(AFX_OCC_SEG)
  14. #endif
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. #define new DEBUG_NEW
  20. /////////////////////////////////////////////////////////////////////////////
  21. COleControlLock::COleControlLock(REFCLSID clsid)
  22. {
  23. // initialize the object
  24. m_pNextLock = NULL;
  25. m_clsid = clsid;
  26. m_pClassFactory = NULL;
  27. // initialize OLE, if necessary
  28. _AFX_THREAD_STATE* pState = AfxGetThreadState();
  29. if (!pState->m_bNeedTerm && !AfxOleInit())
  30. return;
  31. // attempt to lock the class factory of the control
  32. if (SUCCEEDED(::CoGetClassObject(clsid,
  33. CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, NULL, IID_IClassFactory,
  34. (void**)&m_pClassFactory)))
  35. {
  36. ASSERT(m_pClassFactory != NULL);
  37. if (FAILED(m_pClassFactory->LockServer(TRUE)))
  38. {
  39. m_pClassFactory->Release();
  40. m_pClassFactory = NULL;
  41. }
  42. }
  43. }
  44. COleControlLock::~COleControlLock()
  45. {
  46. if (m_pClassFactory != NULL)
  47. {
  48. m_pClassFactory->LockServer(FALSE);
  49. m_pClassFactory->Release();
  50. m_pClassFactory = NULL;
  51. }
  52. }
  53. BOOL AFXAPI AfxOleLockControl(REFCLSID clsid)
  54. {
  55. COleControlLock* pLock = NULL;
  56. TRY
  57. {
  58. pLock = new COleControlLock(clsid);
  59. if (pLock->m_pClassFactory == NULL)
  60. {
  61. delete pLock;
  62. pLock = NULL;
  63. }
  64. else
  65. {
  66. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  67. AfxLockGlobals(CRIT_CTLLOCKLIST);
  68. pModuleState->m_lockList.AddHead(pLock);
  69. AfxUnlockGlobals(CRIT_CTLLOCKLIST);
  70. }
  71. }
  72. CATCH_ALL (e)
  73. {
  74. // Note: DELETE_EXCEPTION(e) not necessary
  75. pLock = NULL;
  76. }
  77. END_CATCH_ALL
  78. return pLock != NULL;
  79. }
  80. BOOL AFXAPI AfxOleLockControl(LPCTSTR lpszProgID)
  81. {
  82. // map prog id to CLSID
  83. CLSID clsid;
  84. HRESULT hr = AfxGetClassIDFromString(lpszProgID, &clsid);
  85. if (FAILED(hr))
  86. return FALSE;
  87. return AfxOleLockControl(clsid);
  88. }
  89. BOOL AFXAPI AfxOleUnlockControl(LPCTSTR lpszProgID)
  90. {
  91. // map prog id to CLSID
  92. CLSID clsid;
  93. HRESULT hr = AfxGetClassIDFromString(lpszProgID, &clsid);
  94. if (FAILED(hr))
  95. return FALSE;
  96. return AfxOleUnlockControl(clsid);
  97. }
  98. BOOL AFXAPI AfxOleUnlockControl(REFCLSID clsid)
  99. {
  100. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  101. AfxLockGlobals(CRIT_CTLLOCKLIST);
  102. COleControlLock* pLock = pModuleState->m_lockList;
  103. BOOL bResult = FALSE;
  104. while (pLock != NULL)
  105. {
  106. COleControlLock* pNext = pLock->m_pNextLock;
  107. if (clsid == pLock->m_clsid)
  108. {
  109. // remove lock from list and delete it
  110. pModuleState->m_lockList.Remove(pLock);
  111. delete pLock;
  112. bResult = TRUE;
  113. }
  114. pLock = pNext;
  115. }
  116. AfxUnlockGlobals(CRIT_CTLLOCKLIST);
  117. return bResult;
  118. }
  119. void AFXAPI AfxOleUnlockAllControls()
  120. {
  121. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  122. COleControlLock* pLock;
  123. AfxLockGlobals(CRIT_CTLLOCKLIST);
  124. while ((pLock = pModuleState->m_lockList) != NULL)
  125. {
  126. pModuleState->m_lockList.Remove(pLock);
  127. delete pLock;
  128. }
  129. ASSERT(pModuleState->m_lockList.IsEmpty());
  130. AfxUnlockGlobals(CRIT_CTLLOCKLIST);
  131. }