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

📄 infomationreport.cpp

📁 运行debug下的cisoca.exe即可。 由于在vc6.0下开发的
💻 CPP
字号:
// InfomationReport.cpp: implementation of the CInfoReport class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WriteInfo.h"

#include "InfomationReport.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

// 因为是static member,所以要在此声明
CPtrList CInfoReport::m_lstpThreads;
DWORD CInfoReport::m_dwFatalErrThrdID;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CInfoReport::CInfoReport()
{

}

CInfoReport::~CInfoReport()
{

}

//////////////////////////////////////////////////////////////////
//	功能函数
//////////////////////////////////////////////////////////////////

//
//  FUNCTION: DWORD Register(LPCTSTR ModuleNameToReg)
//
//  PURPOSE: 根据传入的模块名返回一个ID为调用WriteInfo()作准备
//
//  PARAMETERS:
//		MoudleNameToReg: 用来获取ID的模块名称。
//
//  RETURN VALUE:
//		DWORD类型,实际上是所分配线程在lstpThreads链表中的存储位置。
//
//  COMMENTS:
//
//		当需要日志记录时,需要用该函数取得一个ID来调用WriteInfo()。
//		该函数给出一个新的ID意味着为调用它的模块产生了一个新的日志记录线程。
//
DWORD CInfoReport::Register(LPCTSTR ModuleNameToReg)
{
	CWriteInfo *pWriteInfo = NULL;
	POSITION pos, posPrev;
	// 首先要起动一个维护FatalErr.log的线程
	if(m_lstpThreads.IsEmpty())
	{
		CString strFatalErr = "FatalErr.log";
		// 为每一个需要注册的模块创建操作对应文件的线程
		pWriteInfo = (CWriteInfo*)::AfxBeginThread(RUNTIME_CLASS(CWriteInfo),0,
			0,CREATE_SUSPENDED);
		pWriteInfo->SetModuleFileName(strFatalErr);
		m_dwFatalErrThrdID = (DWORD)m_lstpThreads.AddTail(pWriteInfo);
		pWriteInfo->ResumeThread();
	}
	// 当遇到在一个模块内重复调用该函数这种情况时仍然返回原有的ID即对应线程在
	// m_lstpThreads中的position即可
	pos = m_lstpThreads.GetHeadPosition();
	while(pos)
	{
		posPrev = pos;
		pWriteInfo = (CWriteInfo*)m_lstpThreads.GetNext(pos);
		if(0 == pWriteInfo->GetName().CompareNoCase(ModuleNameToReg))
		{
			return (DWORD)posPrev;
		}
	}
	// 为每一个需要注册的模块创建或者打开操作对应的文件
	{
	}
	// 为每一个需要注册的模块创建操作对应文件的线程
	pWriteInfo = (CWriteInfo*)::AfxBeginThread(RUNTIME_CLASS(CWriteInfo),0,0,
		CREATE_SUSPENDED);
	pWriteInfo->SetModuleFileName(ModuleNameToReg);
	pos = m_lstpThreads.AddTail(pWriteInfo);
	pWriteInfo->ResumeThread();
	return (DWORD)pos;
}

//////////////////////////////////////////////////////////////////
//	功能函数
//////////////////////////////////////////////////////////////////

//
//  FUNCTION: void WriteInfo(DWORD MoudleID, CString InfoDescribe)
//
//  PURPOSE: 将提供的信息写入到对应的日志文件中。
//
//  PARAMETERS:
//		MoudleID: 用Register()函数获取来的模块ID,如果以NULL作为MoudleID来调
//				  用此函数,那就意味着发生了致命错误,信息将被写入到FatalErr.log
//				  文件中。
//		InfoDescribe: 需要记录的信息
//
//  RETURN VALUE:
//		N/A
//
//  COMMENTS:
//
//		用该函数写入日志信息。
//
void CInfoReport::WriteInfo(DWORD MoudleID, CString InfoDescribe)
{
/*	// 如果以NULL作为MoudleID来调用此函数,那就意味着发生了致命错误.
	if(MoudleID == NULL)
		MoudleID = m_dwFatalErrThrdID;
*/  
	ASSERT(MoudleID != NULL);

	CWriteInfo *pWriteInfo = (CWriteInfo*)m_lstpThreads.GetAt(
		(POSITION)MoudleID);
	int len = InfoDescribe.GetLength();
	// 此处重新拷贝信息,new出的内存在TM_WRITE_INFO的消息处理函数中释放。
	char* pChar = new char[len];
	memcpy(pChar,InfoDescribe,len);
	//  用消息的方式同志对用线程进行处理,
	//	wParam: 要写入的内容指针,类型为char*
	//	lParam: 要写入的内容的长度
	::PostThreadMessage(pWriteInfo->m_nThreadID, TM_WRITE_INFO, (WPARAM)pChar,
		len);
}

//////////////////////////////////////////////////////////////////
//	功能函数
//////////////////////////////////////////////////////////////////

//
//  FUNCTION: void WriteInfo(DWORD MoudleID, CString InfoFrom,  CString InfoDescribe)
//
//  PURPOSE: 将提供的信息写入到对应的日志文件中。
//
//  PARAMETERS:
//		MoudleID: 用Register()函数获取来的模块ID,如果以NULL作为MoudleID来调
//				  用此函数,那就意味着发生了致命错误,信息将被写入到FatalErr.log
//				  文件中。
//		InfoFrom: 信息来源, 模块实例的名称,如网元实例名。
//		InfoDescribe: 需要记录的信息
//
//  RETURN VALUE:
//		N/A
//
//  COMMENTS:
//
//		同void WriteInfo(DWORD MoudleID, CString InfoDescribe), 用该函数写入日
//		志信息。
//
void CInfoReport::WriteInfo(DWORD MoudleID, 
							CString InfoFrom, 
							CString InfoDescribe)
{
	// 如果以NULL作为MoudleID来调用此函数,那就意味着发生了致命错误.
	if(MoudleID == NULL)
		MoudleID = m_dwFatalErrThrdID;

	CWriteInfo *pWriteInfo = (CWriteInfo*)m_lstpThreads.GetAt(
		(POSITION)MoudleID);
	int len = 5/*sizeof("From ")*/ + InfoFrom.GetLength() + 3/*sizeof(" : ")*/
		+ InfoDescribe.GetLength();
	// 此处重新拷贝信息,new出的内存在TM_WRITE_INFO的消息处理函数中释放。
	char* pChar = new char[len];
	memcpy(pChar,"From ",5);
	memcpy(pChar + 5, InfoFrom, InfoFrom.GetLength());
	memcpy(pChar + 5 + InfoFrom.GetLength(), " : ",3);
	memcpy(pChar + 5 + InfoFrom.GetLength() + 3,InfoDescribe,
		InfoDescribe.GetLength());
	//  用消息的方式同志对用线程进行处理,
	//	wParam: 要写入的内容指针,类型为char*
	//	lParam: 要写入的内容的长度
	::PostThreadMessage(pWriteInfo->m_nThreadID, TM_WRITE_INFO, (WPARAM)pChar,
		len);
}

void CInfoReport::WriteInfo(DWORD dwMoudleID,CString strUser,
		CString strAction,CString strTarget)
{
	CString InfoDescribe;
	InfoDescribe= strUser +"   "+strAction+"   "+strTarget;
	WriteInfo(dwMoudleID, InfoDescribe);
}

⌨️ 快捷键说明

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