@@ -150,8 +150,9 @@ class CMsRdpClient : public IMsRdpClient10
150150public:
151151 CMsRdpClient (IUnknown* pUnknown)
152152 {
153- m_refCount = 0 ;
153+ m_refCount = 1 ;
154154 m_pUnknown = pUnknown;
155+ pUnknown->AddRef ();
155156
156157 pUnknown->QueryInterface (IID_IDispatch, (LPVOID*)&m_pDispatch);
157158 pUnknown->QueryInterface (IID_IMsTscAx, (LPVOID*)&m_pMsTscAx);
@@ -168,13 +169,10 @@ class CMsRdpClient : public IMsRdpClient10
168169
169170 m_pMsRdpExInstance = CMsRdpExInstance_New (this );
170171 IMsRdpExInstance* pMsRdpExInstance = (IMsRdpExInstance*)m_pMsRdpExInstance;
171- pMsRdpExInstance->AddRef ();
172172 pMsRdpExInstance->GetSessionId (&m_sessionId);
173173 MsRdpEx_InstanceManager_Add (m_pMsRdpExInstance);
174174
175175 m_pMsRdpExtendedSettings = CMsRdpExtendedSettings_New (pUnknown, (IUnknown*)m_pMsTscAx, &m_sessionId);
176- IMsRdpExtendedSettings* pMsRdpExtendedSettings = (IMsRdpExtendedSettings*)m_pMsRdpExtendedSettings;
177- pMsRdpExtendedSettings->AddRef ();
178176 pMsRdpExInstance->AttachExtendedSettings (m_pMsRdpExtendedSettings);
179177
180178 void * pCorePropsRaw = NULL ;
@@ -205,10 +203,9 @@ class CMsRdpClient : public IMsRdpClient10
205203 }
206204
207205 if (m_pMsRdpExInstance) {
208- IMsRdpExInstance* pMsRdpExInstance = (IMsRdpExInstance*)m_pMsRdpExInstance;
209206 MsRdpEx_InstanceManager_Remove (m_pMsRdpExInstance);
210- pMsRdpExInstance ->Release ();
211- pMsRdpExInstance = NULL ;
207+ ((IMsRdpExInstance*)m_pMsRdpExInstance) ->Release ();
208+ m_pMsRdpExInstance = NULL ;
212209 }
213210 }
214211
@@ -715,7 +712,7 @@ class CMsRdpClient : public IMsRdpClient10
715712
716713private:
717714 GUID m_sessionId;
718- ULONG m_refCount = 0 ;
715+ ULONG m_refCount;
719716 IUnknown* m_pUnknown = NULL ;
720717 IDispatch* m_pDispatch = NULL ;
721718 IMsTscAx* m_pMsTscAx = NULL ;
@@ -762,12 +759,12 @@ class CClassFactory : IClassFactory
762759
763760 if (riid == IID_IUnknown) {
764761 *ppvObject = (LPVOID)((IUnknown*)this );
765- m_refCount++ ;
762+ InterlockedIncrement (& m_refCount) ;
766763 return S_OK;
767764 }
768765 if (riid == IID_IClassFactory) {
769766 *ppvObject = (LPVOID)((IClassFactory*)this );
770- m_refCount++ ;
767+ InterlockedIncrement (& m_refCount) ;
771768 return S_OK;
772769 }
773770
@@ -776,19 +773,21 @@ class CClassFactory : IClassFactory
776773
777774 ULONG STDMETHODCALLTYPE AddRef ()
778775 {
779- MsRdpEx_LogPrint (DEBUG, " CClassFactory::AddRef" );
780- return ++m_refCount;
776+ ULONG refCount = InterlockedIncrement (&m_refCount);
777+ MsRdpEx_LogPrint (DEBUG, " CClassFactory::AddRef = %d" , refCount);
778+ return refCount;
781779 }
782780
783781 ULONG STDMETHODCALLTYPE Release ()
784782 {
785- MsRdpEx_LogPrint (DEBUG, " CClassFactory::Release" );
786- if (--m_refCount == 0 )
783+ ULONG refCount = InterlockedDecrement (&m_refCount);
784+ MsRdpEx_LogPrint (DEBUG, " CClassFactory::Release = %d" , refCount);
785+ if (refCount == 0 )
787786 {
788787 delete this ;
789788 return 0 ;
790789 }
791- return m_refCount ;
790+ return refCount ;
792791 }
793792
794793 // IClassFactory interface
@@ -824,6 +823,7 @@ class CClassFactory : IClassFactory
824823 {
825824 CMsRdpClient* pMsRdpClient = new CMsRdpClient ((IUnknown*)*ppvObject);
826825 hr = pMsRdpClient->QueryInterface (riid, ppvObject);
826+ pMsRdpClient->Release ();
827827 }
828828 }
829829
0 commit comments