Win32函数封装(二)---控制台输出(多用于调试),文件读写,dx注册
2007-06-12 11:24
381 查看
// DebugTool.h: interface for the CDebugTool class.
//兰海 lanhai(guoliangw@hotmail.com) http://blog.csdn.net/lanhai/ 调试类 2006-08-06
//出于 助人为乐目的发布,可以任意转载,完善及丰富,但需保留此声明,用于商用请充分测试
//////////////////////////////////////////////////////////////////////
#ifndef __DEBUGTOOL_H
#define __DEBUGTOOL_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <unknwn.h>
class CDebugTool
{
public:
CDebugTool();
virtual ~CDebugTool();
//对外接口
public:
void ConsolOut(char* szinfo,...); //输出信息
void ConsolOutNoRN(char* szinfo,...);
HANDLE CreateBufferFile(LPSTR lpName);
void WriteBuffer2File(HANDLE aFile,LPSTR apBuff,long lSize);
long GetModuleDir(LPSTR lpBuff);
HRESULT AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister);
void RemoveFromRot(DWORD pdwRegister);
void ConsolDel();
HANDLE OpenDbReadFile(LPSTR lpName);
DWORD GetDbFileSize(HANDLE hFile);
BOOL ReadDbFile(HANDLE hFile,LPSTR lpBuff,long lBuffLen);
DWORD GetTheFileSize(char* filename) ;
//内部函数
protected:
void ConsolGet();
protected:
HANDLE mhOut;
BOOL mbSelConsol;
HANDLE mhFile;
BOOL mbRN;
};
#endif //__DEBUGTOOL_H
// DebugTool.cpp: implementation of the CDebugTool class.
//兰海 lanhai(guoliangw@hotmail.com) http://blog.csdn.net/lanhai/ 调试类 2006-08-06
//出于 助人为乐目的发布,可以任意转载,完善及丰富,但需保留此声明,用于商用请充分测试
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "DebugTool.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDebugTool::CDebugTool()
{
mhOut = NULL;
mbSelConsol = FALSE;
mbRN = FALSE;
}
CDebugTool::~CDebugTool()
{
ConsolDel();
}
void CDebugTool::ConsolGet()
{
if(!mhOut)
{
AllocConsole();
mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
mbSelConsol = TRUE;
// mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
// if(INVALID_HANDLE_VALUE == mhOut)
// {
// AllocConsole();
// mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
// mbSelConsol = TRUE;
// }
}
}
void CDebugTool::ConsolDel()
{
if(mhOut && mbSelConsol)
{
FreeConsole();
mhOut =NULL;
mbRN = FALSE;
}
}
void CDebugTool::ConsolOut(char* szinfo,...)
{
va_list argptr;
char strPrintBuff[512];
//把可变参数序列化到strPrintBuff中
va_start(argptr,szinfo);
vsprintf(strPrintBuff, szinfo, argptr);
va_end( argptr );
ConsolGet();
if(mhOut)
{
if(mbRN)
{
WriteConsole(mhOut,"/r/n",lstrlen("/r/n"),NULL,NULL);
}
WriteConsole(mhOut,strPrintBuff,lstrlen(strPrintBuff),NULL,NULL);
WriteConsole(mhOut,"/r/n",lstrlen("/r/n"),NULL,NULL);
}
}
void CDebugTool::ConsolOutNoRN(char* szinfo,...)
{
va_list argptr;
char strPrintBuff[512];
//把可变参数序列化到strPrintBuff中
va_start(argptr,szinfo);
vsprintf(strPrintBuff, szinfo, argptr);
va_end( argptr );
ConsolGet();
if(mhOut)
{
WriteConsole(mhOut,strPrintBuff,lstrlen(strPrintBuff),NULL,NULL);
WriteConsole(mhOut,"/r",lstrlen("/r"),NULL,NULL);
mbRN = TRUE;
}
}
HANDLE CDebugTool::CreateBufferFile(LPSTR lpName)
{
//mhFile = CreateFile(lpName,NULL,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
mhFile = CreateFile(lpName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
return mhFile;
}
void CDebugTool::WriteBuffer2File(HANDLE aFile,LPSTR apBuff,long lSize)
{
DWORD dwWrite;
if(aFile)
{
WriteFile(aFile,apBuff,lSize,&dwWrite,NULL);
}
}
long CDebugTool::GetModuleDir(LPSTR lpBuff)
{
char szPath[MAX_PATH] = {0};
if(lpBuff == NULL)
return 0;
GetModuleFileName(NULL,szPath,sizeof(szPath));
char* pPos = NULL;
pPos = strrchr(szPath,'//');
pPos++;
*pPos = '/0';
lstrcpy(lpBuff,szPath);
return lstrlen(lpBuff);
}
HRESULT CDebugTool::AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister)
{
IMoniker* pMoniker;
IRunningObjectTable* pROT;
if(FAILED(GetRunningObjectTable(0, &pROT))){
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph,
GetCurrentProcessId());
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if(SUCCEEDED(hr)){
hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph,
pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void CDebugTool::RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable* pROT;
if(SUCCEEDED(GetRunningObjectTable(0, &pROT))){
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
HANDLE CDebugTool::OpenDbReadFile(LPSTR lpName)
{
HANDLE hFile = NULL;
hFile = CreateFile(lpName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
return hFile;
}
DWORD CDebugTool::GetDbFileSize(HANDLE hFile)
{
DWORD dwSize = 0;
if(INVALID_FILE_SIZE==GetFileSize(hFile,&dwSize) )
return 0;
return dwSize;
}
BOOL CDebugTool::ReadDbFile(HANDLE hFile,LPSTR lpBuff,long lBuffLen)
{
DWORD dwRead = 0;
LONG lret = 0;
lret = ReadFile(hFile,lpBuff,lBuffLen,&dwRead ,NULL);
if(lret == 0)
return 0;
return dwRead;
}
DWORD CDebugTool::GetTheFileSize(char* filename)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
HRESULT hr;
hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if( INVALID_HANDLE_VALUE == hFile )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
return 0;
}
int dwLength = GetFileSize( hFile, NULL );
CloseHandle(hFile);
return dwLength;
}
lanhai 2007.06.12
//兰海 lanhai(guoliangw@hotmail.com) http://blog.csdn.net/lanhai/ 调试类 2006-08-06
//出于 助人为乐目的发布,可以任意转载,完善及丰富,但需保留此声明,用于商用请充分测试
//////////////////////////////////////////////////////////////////////
#ifndef __DEBUGTOOL_H
#define __DEBUGTOOL_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <unknwn.h>
class CDebugTool
{
public:
CDebugTool();
virtual ~CDebugTool();
//对外接口
public:
void ConsolOut(char* szinfo,...); //输出信息
void ConsolOutNoRN(char* szinfo,...);
HANDLE CreateBufferFile(LPSTR lpName);
void WriteBuffer2File(HANDLE aFile,LPSTR apBuff,long lSize);
long GetModuleDir(LPSTR lpBuff);
HRESULT AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister);
void RemoveFromRot(DWORD pdwRegister);
void ConsolDel();
HANDLE OpenDbReadFile(LPSTR lpName);
DWORD GetDbFileSize(HANDLE hFile);
BOOL ReadDbFile(HANDLE hFile,LPSTR lpBuff,long lBuffLen);
DWORD GetTheFileSize(char* filename) ;
//内部函数
protected:
void ConsolGet();
protected:
HANDLE mhOut;
BOOL mbSelConsol;
HANDLE mhFile;
BOOL mbRN;
};
#endif //__DEBUGTOOL_H
// DebugTool.cpp: implementation of the CDebugTool class.
//兰海 lanhai(guoliangw@hotmail.com) http://blog.csdn.net/lanhai/ 调试类 2006-08-06
//出于 助人为乐目的发布,可以任意转载,完善及丰富,但需保留此声明,用于商用请充分测试
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "DebugTool.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDebugTool::CDebugTool()
{
mhOut = NULL;
mbSelConsol = FALSE;
mbRN = FALSE;
}
CDebugTool::~CDebugTool()
{
ConsolDel();
}
void CDebugTool::ConsolGet()
{
if(!mhOut)
{
AllocConsole();
mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
mbSelConsol = TRUE;
// mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
// if(INVALID_HANDLE_VALUE == mhOut)
// {
// AllocConsole();
// mhOut = GetStdHandle(STD_OUTPUT_HANDLE);
// mbSelConsol = TRUE;
// }
}
}
void CDebugTool::ConsolDel()
{
if(mhOut && mbSelConsol)
{
FreeConsole();
mhOut =NULL;
mbRN = FALSE;
}
}
void CDebugTool::ConsolOut(char* szinfo,...)
{
va_list argptr;
char strPrintBuff[512];
//把可变参数序列化到strPrintBuff中
va_start(argptr,szinfo);
vsprintf(strPrintBuff, szinfo, argptr);
va_end( argptr );
ConsolGet();
if(mhOut)
{
if(mbRN)
{
WriteConsole(mhOut,"/r/n",lstrlen("/r/n"),NULL,NULL);
}
WriteConsole(mhOut,strPrintBuff,lstrlen(strPrintBuff),NULL,NULL);
WriteConsole(mhOut,"/r/n",lstrlen("/r/n"),NULL,NULL);
}
}
void CDebugTool::ConsolOutNoRN(char* szinfo,...)
{
va_list argptr;
char strPrintBuff[512];
//把可变参数序列化到strPrintBuff中
va_start(argptr,szinfo);
vsprintf(strPrintBuff, szinfo, argptr);
va_end( argptr );
ConsolGet();
if(mhOut)
{
WriteConsole(mhOut,strPrintBuff,lstrlen(strPrintBuff),NULL,NULL);
WriteConsole(mhOut,"/r",lstrlen("/r"),NULL,NULL);
mbRN = TRUE;
}
}
HANDLE CDebugTool::CreateBufferFile(LPSTR lpName)
{
//mhFile = CreateFile(lpName,NULL,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
mhFile = CreateFile(lpName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
return mhFile;
}
void CDebugTool::WriteBuffer2File(HANDLE aFile,LPSTR apBuff,long lSize)
{
DWORD dwWrite;
if(aFile)
{
WriteFile(aFile,apBuff,lSize,&dwWrite,NULL);
}
}
long CDebugTool::GetModuleDir(LPSTR lpBuff)
{
char szPath[MAX_PATH] = {0};
if(lpBuff == NULL)
return 0;
GetModuleFileName(NULL,szPath,sizeof(szPath));
char* pPos = NULL;
pPos = strrchr(szPath,'//');
pPos++;
*pPos = '/0';
lstrcpy(lpBuff,szPath);
return lstrlen(lpBuff);
}
HRESULT CDebugTool::AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister)
{
IMoniker* pMoniker;
IRunningObjectTable* pROT;
if(FAILED(GetRunningObjectTable(0, &pROT))){
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph,
GetCurrentProcessId());
HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if(SUCCEEDED(hr)){
hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph,
pMoniker, pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void CDebugTool::RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable* pROT;
if(SUCCEEDED(GetRunningObjectTable(0, &pROT))){
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
HANDLE CDebugTool::OpenDbReadFile(LPSTR lpName)
{
HANDLE hFile = NULL;
hFile = CreateFile(lpName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
return hFile;
}
DWORD CDebugTool::GetDbFileSize(HANDLE hFile)
{
DWORD dwSize = 0;
if(INVALID_FILE_SIZE==GetFileSize(hFile,&dwSize) )
return 0;
return dwSize;
}
BOOL CDebugTool::ReadDbFile(HANDLE hFile,LPSTR lpBuff,long lBuffLen)
{
DWORD dwRead = 0;
LONG lret = 0;
lret = ReadFile(hFile,lpBuff,lBuffLen,&dwRead ,NULL);
if(lret == 0)
return 0;
return dwRead;
}
DWORD CDebugTool::GetTheFileSize(char* filename)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
HRESULT hr;
hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if( INVALID_HANDLE_VALUE == hFile )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
return 0;
}
int dwLength = GetFileSize( hFile, NULL );
CloseHandle(hFile);
return dwLength;
}
lanhai 2007.06.12
相关文章推荐
- 自定义TRACE函数,用于向Output Window、控制台和文件输出Log
- 自定义TRACE函数,用于向Output Window、控制台和文件输出Log
- 将Debug调试信息输出到控制台或文件
- OJ 调试技巧:VS2010 中 通过设置编译参数定义宏,无需修改源文件重定向标准输入输出
- OllyDbg,IDA pro强强联合!从OllyDbg中载入IDA Pro输出的map信息文件,带符号信息调试!
- 使用freopen在文件与控制台之间切换输入、输出
- 调试MFC时使用控制台(consel)输出调试信息
- 利用C#控制台输出txt文件的内容(一行行来的)
- 在android 输出log 信息 用于调试
- C#控制台基础 使用filestream读取txt文本文件并输出到控制台
- NumPy基础 -- 4. 用于数组的文件输入输出
- 【小程序】递归实现控制台输出的文件树形结构
- io流读取文件内容并将其逆值输出到控制台
- outputdebugstring 调试程序 同时也可以输出调试日志文件
- 1.编写一个简单的C语言程序:根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。 2.编写一个C语言程序:打印输出所有“水仙花数”,用gdb调试程序(给出步骤)。所谓“
- LOG4J的配置..实现了输出到控制台、文件、回滚文件、发送日志邮件
- tomcat输出日志到文件和控制台
- MFC利用控制台输出调试信息的方法
- 【转】MFC 利用控制台输出调试信息
- springboot 配置logback控制台彩色打印,按等级输出日志文件