From 82df67d960355e99a66b1db473b9d6236bf2fbb9 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 9 Jul 2002 11:52:11 +0000 Subject: [PATCH] automatically initialize m_cRef to 0 (patch 575011 + more) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16115 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/ole/oleutils.h | 28 +++++++++++++++++++++++----- src/msw/ole/dataobj.cpp | 2 -- src/msw/ole/dropsrc.cpp | 1 - src/msw/ole/droptgt.cpp | 1 - 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/wx/msw/ole/oleutils.h b/include/wx/msw/ole/oleutils.h index 737939078a..1d19f4f763 100644 --- a/include/wx/msw/ole/oleutils.h +++ b/include/wx/msw/ole/oleutils.h @@ -17,9 +17,11 @@ #endif #include "wx/defs.h" + #if wxUSE_NORLANDER_HEADERS -#include + #include #endif + // ============================================================================ // General purpose functions and macros // ============================================================================ @@ -39,7 +41,7 @@ inline void ReleaseInterface(IUnknown *pIUnk) #define RELEASE_AND_NULL(p) if ( (p) != NULL ) { p->Release(); p = NULL; }; // return TRUE if the iid is in the array -bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); +extern bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); // ============================================================================ // IUnknown implementation helpers @@ -51,20 +53,36 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); implementation is quite enough. Usage is trivial: here is all you should have - 1) DECLARE_IUNKNOWN_METHOS in your (IUnknown derived!) class declaration + 1) DECLARE_IUNKNOWN_METHODS in your (IUnknown derived!) class declaration 2) BEGIN/END_IID_TABLE with ADD_IID in between for all interfaces you support (at least all for which you intent to return 'this' from QI, i.e. you should derive from IFoo if you have ADD_IID(Foo)) somewhere else - 3) IMPLEMENT_IUNKNOWN_METHOS somewhere also + 3) IMPLEMENT_IUNKNOWN_METHODS somewhere also These macros are quite simple: AddRef and Release are trivial and QI does lookup in a static member array of IIDs and returns 'this' if it founds the requested interface in it or E_NOINTERFACE if not. */ +/* + wxAutoULong: this class is used for automatically initalising m_cRef to 0 +*/ +class wxAutoULong +{ +public: + wxAutoULong(ULONG value = 0) : m_Value(value) { } + + operator ULONG&() { return m_Value; } + ULONG& operator=(ULONG value) { return m_Value = value; } + +private: + ULONG m_Value; +}; + // declare the methods and the member variable containing reference count // you must also define the ms_aIids array somewhere with BEGIN_IID_TABLE // and friends (see below) + #define DECLARE_IUNKNOWN_METHODS \ public: \ STDMETHODIMP QueryInterface(REFIID, void **); \ @@ -72,7 +90,7 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); STDMETHODIMP_(ULONG) Release(); \ private: \ static const IID *ms_aIids[]; \ - ULONG m_cRef + wxAutoULong m_cRef // macros for declaring supported interfaces // NB: you should write ADD_INTERFACE(Foo) and not ADD_INTERFACE(IID_IFoo)! diff --git a/src/msw/ole/dataobj.cpp b/src/msw/ole/dataobj.cpp index 309a999059..927950ca11 100644 --- a/src/msw/ole/dataobj.cpp +++ b/src/msw/ole/dataobj.cpp @@ -177,7 +177,6 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIEnumFORMATETC) wxIEnumFORMATETC::wxIEnumFORMATETC(const wxDataFormat *formats, ULONG nCount) { - m_cRef = 0; m_nCurrent = 0; m_nCount = nCount; m_formats = new CLIPFORMAT[nCount]; @@ -268,7 +267,6 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIDataObject) wxIDataObject::wxIDataObject(wxDataObject *pDataObject) { - m_cRef = 0; m_pDataObject = pDataObject; m_mustDelete = FALSE; } diff --git a/src/msw/ole/dropsrc.cpp b/src/msw/ole/dropsrc.cpp index 6aae42c5d5..8f0ab7e6f4 100644 --- a/src/msw/ole/dropsrc.cpp +++ b/src/msw/ole/dropsrc.cpp @@ -93,7 +93,6 @@ wxIDropSource::wxIDropSource(wxDropSource *pDropSource) m_pDropSource = pDropSource; m_grfInitKeyState = 0; - m_cRef = 0; } // Name : wxIDropSource::QueryContinueDrag diff --git a/src/msw/ole/droptgt.cpp b/src/msw/ole/droptgt.cpp index d1e4a97b11..c24d9d4008 100644 --- a/src/msw/ole/droptgt.cpp +++ b/src/msw/ole/droptgt.cpp @@ -113,7 +113,6 @@ DWORD wxIDropTarget::GetDropEffect(DWORD flags) wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget) { - m_cRef = 0; m_pTarget = pTarget; m_pIDataObject = NULL; } -- 2.45.2