/*[
	Title: "com2rebol.h C header file"
	File: %com2rebol.h
	Date: 21-Jun-2006
	Version: 1.0.4
	Progress: 0.48
	Status: "working"
	Needs: []
	Author: "Anton Rolls"
	Language: "English"
	Purpose: {Declare the public interface}
	Usage: {}
	License: "BSD"
	History: [
		1.0.0 [15-Dec-2005 {First version} "Anton"]
		1.0.1 [10-Jun-2006 {removed makeContainer, was not properly functioning and was not used anywhere,
			setErrorHandler argument changed from int to void (*function)(PDH_EXCEPTION pException),
			renamed setErrorHandler -> setExceptionHandler
			} "Anton"]
		1.0.2 [11-Jun-2006 {removed initDispHelper and closeDispHelper functions (done automatically now)} "Anton"]
		1.0.3 [15-Jun-2006 {added getLastException formatException formatLastException showLastException} "Anton"]
		1.0.4 [21-Jun-2006 {removed setObject (appeared to be never used and erroneous)} "Anton"]
	]
	ToDo: {
	- declare all the other prototypes making up the public user interface
	}
	Notes: {
		   DevCPP defines BUILDING_DLL 
		VisualC++ defines _EXPORTING
	}
]*/


// I don't think this common piece of code (small as it is) really belongs in this header file,
// as it is a compiler implementation detail.
// There ought to be a "devcpp_compile_dll.h" file to include with this in it.
// That's probably a better place for it.
// or actually, to make clear what it does, name the file "define_DLLIMPORT_for_DevCPP.h" ?

#if BUILDING_DLL  
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


#include <windows.h>
#include "disphelper.h"

//#include <stdarg.h> // for vsprintf


/*// --------- modified excerpt from disphelper.h to support customized exception stuff ----------

#define DISPHELPER_INTERNAL_BUILD
#ifdef DISPHELPER_INTERNAL_BUILD

#ifndef DISPHELPER_NO_EXCEPTIONS

HRESULT c2rExitEx(HRESULT hr, BOOL bDispatchError, LPCWSTR szMember, LPCWSTR szCompleteMember, EXCEPINFO * pExcepInfo, UINT iArgError, LPCWSTR szFunctionName);

#define C2R_EXITEX(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError) \
		c2rExitEx(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError, xx_szFunctionName_xx)

#define C2R_EXIT(hr, szCompleteMember) C2R_EXITEX(hr, FALSE, NULL, szCompleteMember, NULL, 0)


#else  // ----- DISPHELPER_NO_EXCEPTIONS ----- 


#define C2R_EXITEX(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError) \
	(((hr == DISP_E_EXCEPTION && pExcepInfo) ?                      \
	(SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrSource),        \
	 SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrDescription),   \
	 SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrHelpFile), 0) : (0)), hr)
#define C2R_EXIT(hr, szCompleteMember)(hr)

#endif // ----- DISPHELPER_NO_EXCEPTIONS ----- 

#endif // ----- DISPHELPER_INTERNAL_BUILD -----

// ----------------------------------------------------------------- 
*/


//	Public Interface Functions

DLLIMPORT void showMessage(LPCSTR message);
DLLIMPORT char * format(const LPCSTR message, ...);
DLLIMPORT char * vformat(const LPCSTR message, __VALIST marker);
DLLIMPORT void showMessageF(const LPCSTR message, ...);
DLLIMPORT PDH_EXCEPTION getLastException();
DLLIMPORT LPCSTR formatException(PDH_EXCEPTION pException);
DLLIMPORT LPCSTR formatLastException();
DLLIMPORT void showLastException();
DLLIMPORT void toggleExceptions(int option);

DLLIMPORT HRESULT createObject(LPCSTR ansiObjName, IDispatch **ppDisp);
DLLIMPORT HRESULT releaseObject(IDispatch *obj);
DLLIMPORT HRESULT callMethod(IDispatch *pDisp, LPCSTR szMember, ... );

DLLIMPORT HRESULT enumBegin(IEnumVARIANT **ppEnum, IDispatch *pDisp, LPCSTR szMember, ...);
DLLIMPORT HRESULT enumNextObject(IDispatch **ppDisp, IEnumVARIANT *pEnum);

DLLIMPORT HRESULT getString(LPCSTR *result, IDispatch *pDisp, LPCSTR szMember, ...);
DLLIMPORT void getStringCleanup(); // <- call this straight after calling getString

DLLIMPORT HRESULT getInteger(UINT *result, IDispatch *pDisp, LPCSTR szMember, ...);
DLLIMPORT HRESULT getObject(IDispatch **result, IDispatch *pDisp, LPCSTR szMember, ...);

DLLIMPORT HRESULT putValue(IDispatch *pDisp, LPCSTR szMember, ...);
DLLIMPORT HRESULT putRef(IDispatch * pDisp, LPCSTR szMember, ...);

// Prototypes for helper functions (which may be exposed as public interface functions in the Future)

HRESULT getValueV(LPCSTR szIdentifier, void *pResult, IDispatch *pDisp, LPCSTR szMember, va_list *marker);

LPCWSTR AnsiToWideChar(LPCSTR ansi);
HRESULT AnsiToUnicode(LPCSTR pszA, LPCOLESTR* ppszW);

//void oldShowMessageF(const LPCSTR message, ...);

