CrashRpt使用

CrashRpt

中除了错误处理之外值得学习的地方还是不少的,如屏幕截图、邮件

发送。

 

这里主要提取屏幕截图的功能。

 

 

1.

CrashRpt

源码目录中分别复制

minizip

zlib

libpng

到一个目录作为公

共库使用,并分别编译它们生成

lib

,需要设置工程属性为“

多线程调试

(/MTd)

”。

 

 

2.

在公共目录新建

ScreenCap

目录,复制

ScreenCap.h

ScreenCap.cpp

ScreenCap

目录。

 

 

3.

在你的

MFC

工程中添加过滤器

ScreenCap

并把

ScreenCap.h

ScreenCap.cpp

导入进来。

 

 

4.

复制核心代码并做相应修改:

  

 

// This method compresses the files contained in the report and produces ZIP archive. 

BOOL 

CompressFileAsZip

(vector<CString>vtFiles,CString strZipFileName) 

{  

CStringA strZipFileNameA; 

BOOL bStatus = FALSE; 

zipFile hZip = NULL; 

CString sMsg; 

LONG64 lTotalSize = 0; 

LONG64 lTotalCompressed = 0; 

BYTE buff[1024]; 

DWORD dwBytesRead=0; 

HANDLE hFile = INVALID_HANDLE_VALUE; 

LARGE_INTEGER lFileSize; 

BOOL bGetSize = FALSE; 

 

strZipFileNameA=strZipFileName; 

hZip = zipOpen(strZipFileNameA, APPEND_STATUS_CREATE); 

if(hZip==NULL) 

TRACE(_T("Failed to create ZIP file.")); 

goto cleanup; 

 

for(vector<CString>::iterator iter=vtFiles.begin();  

iter!=vtFiles.end(); ++iter ){  

 

CStringA sDstFileNameA; 

CString sFileName=*iter; 

int nPos=sFileName.ReverseFind('\\'); 

if ( nPos!=-1 ){ 

sDstFileNameA=sFileName.Mid(nPos+1); 

}else{ 

sDstFileNameA=sFileName; 

CString sDesc = _T("

描述

"); 

CStringA sDescA; 

sDescA=sDesc; 

 

sMsg.Format(_T("Compressing %s\n"), sDstFileNameA); 

TRACE(sMsg); 

 

HANDLE hFile = CreateFile(sFileName,  

GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);  

if(hFile==INVALID_HANDLE_VALUE) 

sMsg.Format(_T("Couldn't open file %s\n"), sFileName); 

TRACE(sMsg); 

continue; 

 

bGetSize = GetFileSizeEx(hFile, &lFileSize); 

if(!bGetSize) 

sMsg.Format(_T("Couldn't get file size of %s\n"), sFileName); 

TRACE(sMsg); 

CloseHandle(hFile); 

continue; 

 

lTotalSize += lFileSize.QuadPart; 

 

BY_HANDLE_FILE_INFORMATION fi; 

GetFileInformationByHandle(hFile, &fi); 

 

SYSTEMTIME st; 

FileTimeToSystemTime(&fi.ftCreationTime, &st); 

 

zip_fileinfo info; 

info.dosDate = 0; 

info.tmz_date.tm_year = st.wYear; 

info.tmz_date.tm_mon = st.wMonth; 

info.tmz_date.tm_mday = st.wDay; 

info.tmz_date.tm_hour = st.wHour; 

info.tmz_date.tm_min = st.wMinute; 

info.tmz_date.tm_sec = st.wSecond; 

info.external_fa = FILE_ATTRIBUTE_NORMAL; 

info.internal_fa = FILE_ATTRIBUTE_NORMAL; 

 

int n = zipOpenNewFileInZip( hZip, sDstFileNameA, &info, 

NULL, 0, NULL, 0, sDescA, Z_DEFLATED, Z_DEFAULT_COMPRESSION); 

if(n!=0) 

sMsg.Format(_T("Couldn't compress file %s\n"), sDstFileNameA); 

TRACE(sMsg); 

continue; 

 

for(;;) 

BOOL bRead = ReadFile(hFile, buff, 1024, &dwBytesRead, NULL); 

if(!bRead || dwBytesRead==0) 

break; 

 

int res = zipWriteInFileInZip(hZip, buff, dwBytesRead); 

if(res!=0) 

zipCloseFileInZip(hZip); 

sMsg.Format(_T("Couldn't write to compressed file %s\n"), sDstFileNameA); 

TRACE(sMsg); 

break; 

 

lTotalCompressed += dwBytesRead; 

 

zipCloseFileInZip(hZip); 

CloseHandle(hFile); 

hFile = INVALID_HANDLE_VALUE; 

 

if(lTotalSize==lTotalCompressed) 

bStatus = TRUE; 

 

cleanup: 

 

if(hZip!=NULL) 

zipClose(hZip, NULL); 

 

if(hFile!=INVALID_HANDLE_VALUE) 

CloseHandle(hFile); 

 

if(bStatus) 

TRACE(_T("Finished compressing files...OK")); 

else 

TRACE(_T("File compression failed.")); 

 

sMsg.Format(_T("Total file size for compression is %I64d"), lTotalSize); 

 

return bStatus; 

 

void CtestdlgDlg::OnBnClickedOk() 

CScreenCapture 

sc; 

DWORD dwFlags = CR_AS_VIRTUAL_SCREEN; 

 

CPoint m_ptCursorPos; 

GetCursorPos(&m_ptCursorPos); 

std::vector<CString> screenshot_names; 

 

CString m_sErrorReportDirName=_T("C:\\"); 

 

if(dwFlags==CR_AS_VIRTUAL_SCREEN){ 

// Take screenshot of entire desktop 

CRect rcScreen; 

sc.GetScreenRect(&rcScreen); 

 

BOOL bTakeScreenshot = sc.

CaptureScreenRect

(rcScreen, m_ptCursorPos, 

m_sErrorReportDirName, 0, screenshot_names); 

if(bTakeScreenshot==FALSE){ 

return; 

}else if(dwFlags==CR_AS_MAIN_WINDOW){      

// Take screenshot of the main window 

CRect rcWnd; 

GetWindowRect(&rcWnd); 

BOOL bTakeScreenshot = sc.

CaptureScreenRect

(rcWnd, m_ptCursorPos, 

m_sErrorReportDirName, 0, screenshot_names); 

if(bTakeScreenshot==FALSE){       

return; 

}else{     

// Invalid flags 

ATLASSERT(0); 

return; 

 

//     vector<CString>vtFiles; 

//     vtFiles.push_back(_T("C:\\")); 

CompressFileAsZip(screenshot_names,_T("C:\\1.ZIP")); 

AfxMessageBox(_T("OK")); 

}

 

5.

工程链接输入:

libpng\lib\libpngd.lib zlib\lib\zlibd.lib 

minizip\lib\minizipd.lib 

 

用手机扫此二维码:
以下结果由提供:
百科词条:
1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处
复制  |  搜索  |  翻译  |  百科  |  分享  |  二维码
文字已复制
分享至: ×


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值