CrashRpt使用

CrashRpt使用CrashRpt中除了错误处理之外值得学习的地方还是不少的,如屏幕截图、邮件发送。 这里主要提取屏幕截图的功能。  1.从CrashRpt源码目录中分别复制minizip、zlib、libpng到一个目录作为公共库使用,并分别编译它们生成lib,需要设置工程属性为“多线程调试(/MTd)”。

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 

 

用手机扫此二维码:

以下结果由CrashRpt使用提供:

百科词条:

1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处

复制
 | 
搜索
 | 
翻译
 | 
百科
 | 
分享
 | 
二维码

文字已复制

分享至:
×

今天的文章CrashRpt使用分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5213.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注