#pragma once
#include <Windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <vector>

#ifdef C_CALL_STACK_EXPORTS
#define C_CALL_STACK_DLL_API __declspec(dllexport)
#else
#define C_CALL_STACK_DLL_API //__declspec(dllimport)
#endif

// ���Ӷ�dbghelp.lib�ı�������
#pragma comment(lib, "dbghelp.lib")

using namespace std;

namespace ns_ccs {

#define MAX_ADDRESS_LENGTH  32
#define MAX_NAME_LENGTH 1024

	typedef VOID(_stdcall* CallBackCallStack) (VOID);

	typedef struct _CrashInfo
	{
		CHAR ErrorCode[MAX_ADDRESS_LENGTH];
		CHAR Address[MAX_ADDRESS_LENGTH];
		CHAR Flags[MAX_ADDRESS_LENGTH];
	}CrashInfo;

	typedef struct _CallStackInfo
	{
		CHAR ModuleName[MAX_NAME_LENGTH];
		CHAR MethodName[MAX_NAME_LENGTH];
		CHAR FileName[MAX_NAME_LENGTH];
		CHAR LineNumber[MAX_NAME_LENGTH];
	}CallStackInfo;

	class C_CALL_STACK_DLL_API CCallStack
	{
	public:
		
		void SafeStrCpy(char* szDest, size_t nMaxDestSize, const char* szSrc);
		CrashInfo GetCrashInfo(const EXCEPTION_RECORD *pRecord);
		vector<CallStackInfo> GetCallStack(const CONTEXT *pContext);
		
		CCallStack();

	};

}

EXTERN_C C_CALL_STACK_DLL_API LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException);