//+------------------------------------------------------------------+ //| DXHandle.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include "DXObjectBase.mqh" //+------------------------------------------------------------------+ //| Class CDXHandle | //+------------------------------------------------------------------+ class CDXHandle : public CDXObjectBase { protected: int m_handle; // DX handle protected: CDXHandle(void); virtual ~CDXHandle(void); public: int Handle(void) const { return(m_handle); } }; //+------------------------------------------------------------------+ //| CDXHandle constructor | //+------------------------------------------------------------------+ CDXHandle::CDXHandle(void) : m_handle(-1) { } //+------------------------------------------------------------------+ //| CDXHandle destructor | //+------------------------------------------------------------------+ CDXHandle::~CDXHandle(void) { if(m_handle!=-1) { DXRelease(m_handle); m_handle=-1; } } //+------------------------------------------------------------------+ //| Class CDXHandleShared | //+------------------------------------------------------------------+ class CDXHandleShared : public CDXHandle { protected: ulong m_references; // reference count to the shared object protected: virtual ~CDXHandleShared(void); public: CDXHandleShared(void); virtual ulong AddRef(void); virtual ulong References(void); virtual ulong Release(void); bool operator!(void) const { return(m_handle==INVALID_HANDLE); } }; //+------------------------------------------------------------------+ //| CDXHandleShared constructor | //+------------------------------------------------------------------+ CDXHandleShared::CDXHandleShared(void) : m_references(1) { } //+------------------------------------------------------------------+ //| CDXHandleShared destructor | //+------------------------------------------------------------------+ CDXHandleShared::~CDXHandleShared(void) { //--- check reference count for the debuging reason #ifdef _DEBUG if(m_references) { Alert("CDXHandleShared object was deleted with non-zero references count!"); DebugBreak(); } #endif } //+------------------------------------------------------------------+ //| Add reference to the shared object | //+------------------------------------------------------------------+ ulong CDXHandleShared::AddRef(void) { //--- return new reference count for the debugging reason return(++m_references); } //+------------------------------------------------------------------+ //| Get references count to the shared object | //+------------------------------------------------------------------+ ulong CDXHandleShared::References(void) { //--- return new reference count for the debugging reason return(m_references); } //+------------------------------------------------------------------+ //| Remove reference from the shared object | //+------------------------------------------------------------------+ ulong CDXHandleShared::Release(void) { if(!m_references) return(0); //--- m_references--; //--- delete shared object if there no any references if(!m_references) { delete &this; return(0); } //--- return new reference count for the debugging reason return(m_references); } //+------------------------------------------------------------------+