⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oserror.cpp

📁 一个双向栈的C++实现
💻 CPP
字号:
#include "StdAfx.h"
#include "OSError.h"
#include "TimeWrap.h"
#include "Synchronize.h"

bool COSError::m_show_out=true;
FILE* COSError::m_log=NULL;
PLogProc COSError::m_proc=NULL;

void COSError::LogMessage(const TCHAR* msg)
{
	static CLock lock;
	TCHAR txt[512];
	size_t len = CTimeWrap::GetNow(txt, _countof(txt));
	_stprintf_s(txt + len, _countof(txt) - len, _T("  %s%s"), msg, _T("\r\n"));
	lock.Lock();
	try
	{
		if(m_proc!=NULL)
			m_proc(txt);
		 else if(m_show_out)
			 _tprintf_s(_T("%s"), txt);

		if(m_log != NULL)
			_fputts(txt, m_log);
	}
	catch(...)
	{
	}
	lock.UnLock();
}

void COSError::LogMessage(const TCHAR* header, const TCHAR* msg)
{

	TCHAR txt[256];
	_stprintf_s(txt, _countof(txt), _T("%s:%s"), header, msg);
	LogMessage(txt);
}

void COSError::GetOSError(TCHAR* buf, size_t buflen, const TCHAR* pname, const TCHAR* pparam, unsigned errorno)
{
	if(errorno==0)
		errorno = GetLastError();

	TCHAR MsgBuf[512];

	int len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
		NULL,
		errorno, 
		MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
		MsgBuf, 
		_countof(MsgBuf),
		NULL);

	if(len > 0)
	{
		_stprintf_s(buf, buflen, _T("%s %s failed with error %d: %s"), pname!=NULL? pname:_T(""), pparam!=NULL? pparam:_T(""), errorno, MsgBuf);
		return;
	}
	_stprintf_s(buf, buflen, _T("%s %s failed with error %d: unknown"), pname!=NULL? pname:_T(""), pparam!=NULL? pparam:_T(""), errorno);
}

void COSError::LogOSError(const TCHAR* pname, const TCHAR* pparam, unsigned errorno)
{
	TCHAR buf[512];
	GetOSError(buf, _countof(buf), pname, pparam, errorno);
	LogMessage(buf);
}

void COSError::ThrowOSError(const TCHAR* pname, const TCHAR* pparam, unsigned errorno)
{
	TCHAR buf[512];
	GetOSError(buf, _countof(buf), pname, pparam, errorno);
	LogMessage(buf);
	throw buf; 	
}

bool COSError::CheckError(unsigned errorno)
{
	if(errorno == 0)
	{
		return true;
	}
	TCHAR buf[512];
	GetOSError(buf, _countof(buf), NULL, NULL, errorno);
	LogMessage(buf);
	return false;
}

void COSError::ThrowError(unsigned errorno)
{
	if(errorno == 0)
	{
		return;
	}
	TCHAR buf[512];
	GetOSError(buf, _countof(buf), NULL, NULL, errorno);
	LogMessage(buf);
	throw buf; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -