123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- #ifndef __ExternalConnectionImpl_h__
- #define __ExternalConnectionImpl_h__
- #include <TCLib.h>
- #include <comdef.h>
- #define COM_INTERFACE_ENTRIES_IExternalConnectionImpl() \
- COM_INTERFACE_ENTRY_FUNC(IID_IExternalConnection, 0, \
- QI_IExternalConnectionImpl)
- template <class T>
- class ATL_NO_VTABLE IExternalConnectionImpl : public IExternalConnection
- {
- public:
- IExternalConnectionImpl();
- public:
- void DoLastReleaseClosing();
- protected:
- void DumpConnection(int nDirection, DWORD extconn, DWORD reserved,
- BOOL fLastReleaseCloses = FALSE);
- protected:
- static HRESULT WINAPI QI_IExternalConnectionImpl(void* pvThis, REFIID,
- LPVOID* ppv, DWORD);
- public:
- STDMETHOD_(DWORD, AddConnection)(DWORD extconn, DWORD reserved);
- STDMETHOD_(DWORD, ReleaseConnection)(DWORD extconn, DWORD reserved,
- BOOL fLastReleaseCloses);
- protected:
- DWORD m_dwStrong;
- };
- template <class T>
- IExternalConnectionImpl<T>::IExternalConnectionImpl()
- : m_dwStrong(0)
- {
- }
- template <class T>
- void IExternalConnectionImpl<T>::DoLastReleaseClosing()
- {
- BOOL bNoDisconnect = FALSE;
- #ifdef _DEBUG
-
- const LPCSTR pszClass = TCTypeName(T);
-
- CRegKey key;
- LPCTSTR pszKey = TEXT("Software\\MultiMedia Access");
- LONG lResult = key.Open(HKEY_LOCAL_MACHINE, pszKey);
- if (ERROR_SUCCESS == lResult)
- {
- DWORD dwValue = 0;
- LPCTSTR pszValue = TEXT("DisableLastReleaseClosing");
- if (ERROR_SUCCESS == (lResult = key.QueryValue(dwValue, pszValue)))
- if (dwValue)
- bNoDisconnect = TRUE;
- }
- #endif
-
- T* pThis = static_cast<T*>(this);
-
- IUnknown* punk = NULL;
- {
- TCObjectLock<T> lock(pThis);
- punk = pThis->GetUnknown();
-
- #ifdef _DEBUG
- ATLTRACE1("IExternalConnectionImpl<%hs>::", pszClass);
- ATLTRACE0("DoLastReleaseClosing(): Entering, ");
- ATLTRACE1("m_dwRef = %d\n", pThis->m_dwRef);
- #endif
- }
-
- if (bNoDisconnect)
- {
- #ifdef _DEBUG
- ATLTRACE1("\tIExternalConnectionImpl<%hs>::", pszClass);
- ATLTRACE0("DoLastReleaseClosing(): Skipping CoDisconnectObject ");
- ATLTRACE0("due to registry value\n");
- #endif
- }
- else
- {
- #ifdef _DEBUG
- ATLTRACE1("\tIExternalConnectionImpl<%hs>::", pszClass);
- ATLTRACE0("DoLastReleaseClosing(): Prior to CoDisconnectObject\n");
- #endif
-
- HRESULT hr = CoDisconnectObject(punk, 0);
- #ifdef _DEBUG
- ATLTRACE1("\tIExternalConnectionImpl<%hs>::", pszClass);
- ATLTRACE0("DoLastReleaseClosing(): CoDisconnectObject ");
- ATLTRACE1("returned 0x%08X\n", hr);
- #endif
- }
-
- #ifdef _DEBUG
- {
- TCObjectLock<T> lock(pThis);
- ATLTRACE1("IExternalConnectionImpl<%hs>::", TCTypeName(T));
- ATLTRACE0("DoLastReleaseClosing(): Exiting, ");
- ATLTRACE1("m_dwRef = %d\n", pThis->m_dwRef);
- }
- #endif
- }
- template <class T>
- void IExternalConnectionImpl<T>::DumpConnection(int nDirection,
- DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses)
- {
- #ifdef _DEBUG
- {
-
- TCObjectLock<T> lock(static_cast<T*>(this));
- int nStrong = (int)m_dwStrong;
-
- bool bStrong = (extconn & EXTCONN_STRONG);
-
- const LPCSTR pszClass = TCTypeName(T);
-
- assert(1 == nDirection || -1 == nDirection);
- const LPCSTR pszMethod =
- (nDirection > 0) ? "AddConnection" : "ReleaseConnection";
-
- ATLTRACE2("IExternalConnectionImpl<%hs>::%hs(): ", pszClass, pszMethod);
-
- ATLTRACE1("m_dwStrong= %d", nStrong + (bStrong ? nDirection : 0));
-
- if (nDirection < 0)
- ATLTRACE1(" fLastReleaseCloses= %hs",
- fLastReleaseCloses ? "TRUE" : "FALSE");
- if (!bStrong)
- ATLTRACE1(" extconn= 0x%08X (!=EXTCONN_STRONG)", extconn);
-
- ATLTRACE0("\n");
- }
- #endif
- }
- template <class T>
- HRESULT WINAPI IExternalConnectionImpl<T>::QI_IExternalConnectionImpl(
- void* pvThis, REFIID, LPVOID* ppv, DWORD)
- {
- static DWORD dwDisableIExternalConnection = -1;
- if (-1 == dwDisableIExternalConnection)
- {
-
- dwDisableIExternalConnection = 0;
- #ifdef _DEBUG
-
- CRegKey key;
- const LPCTSTR pszKey = TEXT("Software\\MultiMedia Access");
- LONG lResult = key.Open(HKEY_LOCAL_MACHINE, pszKey);
- if (ERROR_SUCCESS == lResult)
- {
- const LPCTSTR pszValue = TEXT("DisableIExternalConnection");
- lResult = key.QueryValue(dwDisableIExternalConnection, pszValue);
- }
- #endif
- }
-
- CLEAROUT(ppv, (void*)NULL);
-
- if (dwDisableIExternalConnection)
- return E_NOINTERFACE;
-
- T* pThis = static_cast<T*>(pvThis);
- IExternalConnection* pec = static_cast<IExternalConnection*>(pThis);
- if (!pec)
- return E_NOINTERFACE;
-
- CLEAROUT(ppv, (void*)pec);
- pec->AddRef();
-
- return S_OK;
- }
- template <class T>
- STDMETHODIMP_(DWORD) IExternalConnectionImpl<T>::AddConnection(DWORD extconn,
- DWORD reserved)
- {
- TCObjectLock<T> lock(static_cast<T*>(this));
- DumpConnection(1, extconn, reserved);
- return (extconn & EXTCONN_STRONG) ? ++m_dwStrong : 0;
- }
- template <class T>
- STDMETHODIMP_(DWORD) IExternalConnectionImpl<T>::ReleaseConnection(
- DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses)
- {
- TCObjectLock<T> lock(static_cast<T*>(this));
- DumpConnection(-1, extconn, reserved, fLastReleaseCloses);
- if (extconn & EXTCONN_STRONG)
- {
- DWORD nStrong = --m_dwStrong;
- lock.Unlock();
- if (0 == nStrong && fLastReleaseCloses)
- static_cast<T*>(this)->DoLastReleaseClosing();
- return nStrong;
- }
- else
- return 0;
- }
- #endif
|