#define BAIL_IF_ERROR(hr) \ 
        if (FAILED(hr)) {       \ 
                goto cleanup;   \ 
        }\ 
 
#define BAIL_ON_FAILURE(hr) \ 
        if (FAILED(hr)) {       \ 
                goto error;   \ 
        }\ 
 
#define CONTINUE_ON_FAILURE(hr) \ 
        if (FAILED(hr)) {       \ 
                continue;   \ 
        }\ 
 
#define BAIL_ON_SUCCESS(hr) \ 
        if (SUCCEEDED(hr)) {       \ 
                goto error;   \ 
        }\ 
 
#define QUERY_INTERFACE(hr, ptr, iid, ppObj) \ 
        hr = ptr->QueryInterface(iid, (void **)ppObj); \ 
        if (FAILED(hr)) {    \ 
                goto cleanup;\ 
        }\ 
 
 
#define RRETURN_ENUM_STATUS(hr) \ 
        if (hr != S_OK) {       \ 
            RRETURN(S_FALSE);   \ 
        }                       \ 
        RRETURN(S_OK); 
 
 
 
 
#define DEFINE_IDispatch_Implementation_Unimplemented(cls) \ 
STDMETHODIMP                                                          \ 
cls::GetTypeInfoCount(unsigned int FAR* pctinfo)        \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::GetTypeInfo(unsigned int itinfo, LCID lcid,        \ 
        ITypeInfo FAR* FAR* pptinfo)                                  \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::GetIDsOfNames(REFIID iid, LPWSTR FAR* rgszNames,   \ 
        unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)         \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::Invoke(DISPID dispidMember, REFIID iid, LCID lcid, \ 
        unsigned short wFlags, DISPPARAMS FAR* pdispparams,           \ 
        VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo,           \ 
        unsigned int FAR* puArgErr)                                   \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
} 
 
 
 
 
#define DEFINE_IDispatch_Implementation(cls)                          \ 
STDMETHODIMP                                                          \ 
cls::GetTypeInfoCount(unsigned int FAR* pctinfo)                      \ 
{                                                                     \ 
        RRETURN(_pDispMgr->GetTypeInfoCount(pctinfo));                \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::GetTypeInfo(unsigned int itinfo, LCID lcid,                      \ 
        ITypeInfo FAR* FAR* pptinfo)                                  \ 
{                                                                     \ 
        RRETURN(_pDispMgr->GetTypeInfo(itinfo,                        \ 
                                       lcid,                          \ 
                                       pptinfo                        \ 
                                       ));                            \ 
}                                                                     \ 
STDMETHODIMP                                                          \ 
cls::GetIDsOfNames(REFIID iid, LPWSTR FAR* rgszNames,                 \ 
        unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)         \ 
{                                                                     \ 
        RRETURN(_pDispMgr->GetIDsOfNames(iid,                         \ 
                                         rgszNames,                   \ 
                                         cNames,                      \ 
                                         lcid,                        \ 
                                         rgdispid                     \ 
                                         ));                          \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::Invoke(DISPID dispidMember, REFIID iid, LCID lcid,               \ 
        unsigned short wFlags, DISPPARAMS FAR* pdispparams,           \ 
        VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo,           \ 
        unsigned int FAR* puArgErr)                                   \ 
{                                                                     \ 
        RRETURN (_pDispMgr->Invoke(dispidMember,                      \ 
                                   iid,                               \ 
                                   lcid,                              \ 
                                   wFlags,                            \ 
                                   pdispparams,                       \ 
                                   pvarResult,                        \ 
                                   pexcepinfo,                        \ 
                                   puArgErr                           \ 
                                   ));                                \ 
} 
 
#define DEFINE_IADs_Implementation(cls)                             \ 
STDMETHODIMP                                                          \ 
cls::get_Name(THIS_ BSTR FAR* retval)                                 \ 
{                                                                     \ 
    RRETURN(get_CoreName(retval));                                    \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::get_ADsPath(THIS_ BSTR FAR* retval)                            \ 
{                                                                     \ 
                                                                      \ 
    RRETURN(get_CoreADsPath(retval));                               \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::get_Class(THIS_ BSTR FAR* retval)                                \ 
{                                                                     \ 
                                                                      \ 
    RRETURN(get_CoreADsClass(retval));                              \ 
}                                                                     \ 
                                                                      \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::get_Parent(THIS_ BSTR FAR* retval)                               \ 
{                                                                     \ 
    RRETURN(get_CoreParent(retval));                                  \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::get_Schema(THIS_ BSTR FAR* retval)                               \ 
{                                                                     \ 
    RRETURN(get_CoreSchema(retval));                                  \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::get_GUID(THIS_ BSTR FAR* retval)                                 \ 
{                                                                     \ 
    RRETURN(get_CoreGUID(retval));                                    \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::GetEx(THIS_ BSTR bstrName, VARIANT FAR* pvProp)                  \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}                                                                     \ 
                                                                      \ 
STDMETHODIMP                                                          \ 
cls::PutEx(THIS_ long lnControlCode, BSTR bstrName, VARIANT vProp)    \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}                                                                     \ 
STDMETHODIMP                                                          \ 
cls::GetInfoEx(THIS_ VARIANT vProperties, long lnReserved)            \ 
{                                                                     \ 
    RRETURN(E_NOTIMPL);                                               \ 
}