X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..d9e2e4c2425b8338ff6e6cd2fb62438c9fb2a12b:/include/wx/msw/ole/oleutils.h?ds=sidebyside diff --git a/include/wx/msw/ole/oleutils.h b/include/wx/msw/ole/oleutils.h index 98cb02176b..afab7f2854 100644 --- a/include/wx/msw/ole/oleutils.h +++ b/include/wx/msw/ole/oleutils.h @@ -17,9 +17,10 @@ #endif #include "wx/defs.h" -#ifdef wxUSE_NORLANDER_HEADERS + +// get IUnknown, REFIID &c #include -#endif + // ============================================================================ // General purpose functions and macros // ============================================================================ @@ -39,7 +40,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 +52,42 @@ 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; } + + wxAutoULong& operator++() { ++m_Value; return *this; } + const wxAutoULong operator++( int ) { wxAutoULong temp = *this; ++m_Value; return temp; } + + wxAutoULong& operator--() { --m_Value; return *this; } + const wxAutoULong operator--( int ) { wxAutoULong temp = *this; --m_Value; return temp; } + +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 +95,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)! @@ -126,7 +149,7 @@ bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); // VZ: I don't know it's not done for compilers other than VC++ but I leave it // as is. Please note, though, that tracing OLE interface calls may be // incredibly useful when debugging OLE programs. -#if defined(__WXDEBUG__) && defined(__VISUALC__) && (__VISUALC__ >= 1000) +#if defined(__WXDEBUG__) && ( ( defined(__VISUALC__) && (__VISUALC__ >= 1000) ) || defined(__MWERKS__) ) // ---------------------------------------------------------------------------- // All OLE specific log functions have DebugTrace level (as LogTrace) // ---------------------------------------------------------------------------- @@ -144,5 +167,44 @@ void wxLogRelease(const wxChar *szInterface, ULONG cRef); #define wxLogRelease(szInterface, cRef) #endif //WXDEBUG +// wrapper around BSTR type (by Vadim Zeitlin) + +class WXDLLEXPORT wxBasicString +{ +public: + // ctors & dtor + wxBasicString(const char *sz); + wxBasicString(const wxString& str); + ~wxBasicString(); + + void Init(const char* sz); + + // accessors + // just get the string + operator BSTR() const { return m_wzBuf; } + // retrieve a copy of our string - caller must SysFreeString() it later! + BSTR Get() const { return SysAllocString(m_wzBuf); } + +private: + // @@@ not implemented (but should be) + wxBasicString(const wxBasicString&); + wxBasicString& operator=(const wxBasicString&); + + OLECHAR *m_wzBuf; // actual string +}; + +// Convert variants +class WXDLLEXPORT wxVariant; + +bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) ; +bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) ; + +// Convert string to Unicode +BSTR wxConvertStringToOle(const wxString& str); + +// Convert string from BSTR to wxString +wxString wxConvertStringFromOle(BSTR bStr); + + #endif //_WX_OLEUTILS_H