#ifndef __OLEBIND_HXX__
#define __OLEBIND_HXX__

#include <safepnt.hxx>

//  safe ptrs so we release interfaces in error paths

SAFE_INTERFACE_PTR(XUnknown,		IUnknown)
SAFE_INTERFACE_PTR(XBindCtx,		IBindCtx)
SAFE_INTERFACE_PTR(XMoniker,		IMoniker)
SAFE_INTERFACE_PTR(XStream,		IStream)
SAFE_INTERFACE_PTR(XMalloc,		IMalloc)
SAFE_INTERFACE_PTR(XOleObject,		IOleObject)
SAFE_INTERFACE_PTR(XRunningObjectTable,	IRunningObjectTable)
SAFE_INTERFACE_PTR(XEnumMoniker,	IEnumMoniker)
SAFE_INTERFACE_PTR(XOleItemContainer,	IOleItemContainer)
SAFE_INTERFACE_PTR(XDispatch,		IDispatch)


//  string version of process id
extern WCHAR wszPid[10];


#define LAST_RELEASE(x) \
    { \
	ULONG cnt = x->Release(); \
	x.Detach();		  \
	LPSTR pname = #x; \
	if (cnt) \
	{ \
	    printf("%s:%d %s still has refs = %ld\n", __FILE__, __LINE__, \
		pname, cnt); \
	} \
    }


#define DISPLAY_REFS(x) \
    { \
	x->AddRef(); \
	ULONG cnt = x->Release(); \
	LPSTR pname = #x; \
	printf("%s refs = %ld\n", pname, cnt); \
    }


extern const char *szOleBindError;
extern char wszErrBuf[];

// Failure return macro to be used when you are not interested in an
// HRESULT.
#define TEST_FAILED(x, y) \
    if (x) \
    { \
	wsprintfA(&wszErrBuf[0], "%s:%d %s", __FILE__, __LINE__, y); \
        MessageBoxA(NULL, &wszErrBuf[0], szOleBindError, MB_OK); \
	return TRUE; \
    }

// Failure return macro to be used when you have an interesting HRESULT
// to return.
#define TEST_FAILED_HR(x, y) \
    if (x) \
    { \
	wsprintfA(&wszErrBuf[0], "%s:%d %s HRESULT = %lx", __FILE__, __LINE__, y, hr); \
        MessageBoxA(NULL, &wszErrBuf[0], szOleBindError, MB_OK); \
	return TRUE; \
    }


// Failure return macro to be used when you have an interesting HRESULT
// to return.
#define TEST_FAILED_LAST_ERROR(x, y) \
    if (x) \
    { \
	wsprintfA(&wszErrBuf[0], "%s:%d %s Error = %lx",\
            __FILE__, __LINE__, y, GetLastError()); \
        MessageBoxA(NULL, &wszErrBuf[0], szOleBindError, MB_OK); \
	return TRUE; \
    }


extern WCHAR LongDir[MAX_PATH];
extern WCHAR LongDirShort[MAX_PATH];
extern WCHAR LongDirLong[MAX_PATH];
extern WCHAR LongDirLongSe[MAX_PATH];

// Test standard IMalloc interface
BOOL TestStdMalloc(void);

#endif // __OLEBIND_HXX__