//
// 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.
//
// 
// UnmanagedFault.cpp : Definiuje punkt wejścia dla aplikacji DLL.
//

#include "stdafx.h"
#include "UnmanagedFault.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}

UNMANAGEDFAULT_API int Fail(void)
{
	throw "To jest błąd";
	return 42;
}

class custom_exception : public std::exception
{
public:
	explicit custom_exception(const std::string& _message) : message(_message)
	{
	}

	virtual ~custom_exception()
	{
	}

	virtual const char *what()
	{
		return (message.c_str());
	}

private:
	// Wiadomość
	std::string message;
};

UNMANAGEDFAULT_API int Custom(void)
{
	throw custom_exception("To jest własny wyjątek");
	return 42;
}
UNMANAGEDFAULT_API int DivideByZero(void)
{
	int a = 0;
	int b = 1;
	return b/a;
}
UNMANAGEDFAULT_API int MemoryAccess(void)
{
	int *pint = 0;
	pint[5] = 10;
	return 0;
}
