Win32函数封装(二)---控制台输出(多用于调试),文件读写,dx注册

// DebugTool.h: interface for the CDebugTool class.
//兰海 lanhai(guoliangw@hotmail.comhttp://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.comhttp://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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值