您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐