//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
// COMFault.h : Deklaracja CCOMFault

#pragma once
#include "resource.h"       // główne symbole


// ICOMFault
[
	object,
	uuid("FA39498B-3E02-4F00-A385-2DD27DD97BA3"),
	dual,	helpstring("Interfejs ICOMFault"),
	pointer_default(unique)
]
__interface ICOMFault : IDispatch
{
	[id(1), helpstring("metoda Fail")] HRESULT Fail(void);
	[id(2), helpstring("metoda FailWithErrorInfo")] HRESULT FailWithErrorInfo(void);
};



// CCOMFault

[
	coclass,
	threading("both"),
	support_error_info("ICOMFault"),
	vi_progid("COMError.COMFault"),
	progid("COMError.COMFault.1"),
	version(1.0),
	uuid("C4344270-3684-4D51-A739-F921BAF7BC74"),
	helpstring("Klasa COMFault")
]
class ATL_NO_VTABLE CCOMFault : 
	public ICOMFault
{
public:
	CCOMFault()
	{
		m_pUnkMarshaler = NULL;
	}


	DECLARE_PROTECT_FINAL_CONSTRUCT()
	DECLARE_GET_CONTROLLING_UNKNOWN()

	HRESULT FinalConstruct()
	{
		return CoCreateFreeThreadedMarshaler(
			GetControllingUnknown(), &m_pUnkMarshaler.p);
	}

	void FinalRelease()
	{
		m_pUnkMarshaler.Release();
	}

	CComPtr<IUnknown> m_pUnkMarshaler;

public:

	STDMETHOD(Fail)(void);
	STDMETHOD(FailWithErrorInfo)(void);
};

