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
This commit is contained in:
Vadim Zeitlin
2002-07-09 11:52:11 +00:00
parent 264a108642
commit 82df67d960
4 changed files with 23 additions and 9 deletions

View File

@@ -17,9 +17,11 @@
#endif #endif
#include "wx/defs.h" #include "wx/defs.h"
#if wxUSE_NORLANDER_HEADERS #if wxUSE_NORLANDER_HEADERS
#include <ole2.h> #include <ole2.h>
#endif #endif
// ============================================================================ // ============================================================================
// General purpose functions and macros // 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; }; #define RELEASE_AND_NULL(p) if ( (p) != NULL ) { p->Release(); p = NULL; };
// return TRUE if the iid is in the array // 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 // IUnknown implementation helpers
@@ -51,20 +53,36 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount);
implementation is quite enough. implementation is quite enough.
Usage is trivial: here is all you should have 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 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, 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 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 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 lookup in a static member array of IIDs and returns 'this' if it founds
the requested interface in it or E_NOINTERFACE if not. 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 // declare the methods and the member variable containing reference count
// you must also define the ms_aIids array somewhere with BEGIN_IID_TABLE // you must also define the ms_aIids array somewhere with BEGIN_IID_TABLE
// and friends (see below) // and friends (see below)
#define DECLARE_IUNKNOWN_METHODS \ #define DECLARE_IUNKNOWN_METHODS \
public: \ public: \
STDMETHODIMP QueryInterface(REFIID, void **); \ STDMETHODIMP QueryInterface(REFIID, void **); \
@@ -72,7 +90,7 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount);
STDMETHODIMP_(ULONG) Release(); \ STDMETHODIMP_(ULONG) Release(); \
private: \ private: \
static const IID *ms_aIids[]; \ static const IID *ms_aIids[]; \
ULONG m_cRef wxAutoULong m_cRef
// macros for declaring supported interfaces // macros for declaring supported interfaces
// NB: you should write ADD_INTERFACE(Foo) and not ADD_INTERFACE(IID_IFoo)! // NB: you should write ADD_INTERFACE(Foo) and not ADD_INTERFACE(IID_IFoo)!

View File

@@ -177,7 +177,6 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIEnumFORMATETC)
wxIEnumFORMATETC::wxIEnumFORMATETC(const wxDataFormat *formats, ULONG nCount) wxIEnumFORMATETC::wxIEnumFORMATETC(const wxDataFormat *formats, ULONG nCount)
{ {
m_cRef = 0;
m_nCurrent = 0; m_nCurrent = 0;
m_nCount = nCount; m_nCount = nCount;
m_formats = new CLIPFORMAT[nCount]; m_formats = new CLIPFORMAT[nCount];
@@ -268,7 +267,6 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIDataObject)
wxIDataObject::wxIDataObject(wxDataObject *pDataObject) wxIDataObject::wxIDataObject(wxDataObject *pDataObject)
{ {
m_cRef = 0;
m_pDataObject = pDataObject; m_pDataObject = pDataObject;
m_mustDelete = FALSE; m_mustDelete = FALSE;
} }

View File

@@ -93,7 +93,6 @@ wxIDropSource::wxIDropSource(wxDropSource *pDropSource)
m_pDropSource = pDropSource; m_pDropSource = pDropSource;
m_grfInitKeyState = 0; m_grfInitKeyState = 0;
m_cRef = 0;
} }
// Name : wxIDropSource::QueryContinueDrag // Name : wxIDropSource::QueryContinueDrag

View File

@@ -113,7 +113,6 @@ DWORD wxIDropTarget::GetDropEffect(DWORD flags)
wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget) wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget)
{ {
m_cRef = 0;
m_pTarget = pTarget; m_pTarget = pTarget;
m_pIDataObject = NULL; m_pIDataObject = NULL;
} }