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
©2013 Baidu 使用百度前必读 | 文库协议
![](http://img.baidu.com/img/iknow/wenku/fanyi/fanyi.png)
CrashRpt使用相关推荐
- 计算机中丢失crashrpt,crashrpt
手机评站网今天精心准备的是<crashrpt>,下面是详解! crashrpt.exe-应用程序错误,怎么办? 请修复一下系统试试 1.开机按F8进入安全模式后在退出,选重启或关机在开机, ...
- 提取CrashRpt中屏幕截图并压缩为zip的功能
CrashRpt中除了错误处理之外值得学习的地方还是不少的,如屏幕截图.邮件发送. 这里主要提取屏幕截图的功能. 1.从CrashRpt源码目录中分别复制minizip.zlib.libpng到一个目 ...
- CrashRpt开源代码使用详解(一):CrashRpt介绍及简单应用
CrashRpt开源代码使用详解(一):CrashRpt介绍及简单应用 1.简介 CrashRpt是一个开源的第三方包,在程序出现未处理异常时,能够收集错误信息,并生成程序错误报告.CrashRpt可 ...
- Windows平台崩溃转储系统crashrpt的使用
概述 CrashRpt 是一个免费的.轻量级的开源错误报告库开源库,旨在拦截C++程序中的异常,收集有关崩溃的技术信息并通过互联网向软件供应商发送错误报告,用于在 Microsoft Visual S ...
- 计算机中丢失crashrpt,crashrpt.dll
crashrpt.dll是smartFTP中一款重要的dll文件,缺少它将导致软件的部分功能无法实现或者无法启动,如果计算机弹出crashrpt.dll丢失或者找不到crashrpt.dll的问题,下 ...
- 计算机中丢失crashrpt,修复crashrpt.dll
crashrpt.dll是电脑系统必备的一个DLL组件修复程序.系统重要文件 crashrpt.dll .crashrpt.dll(含64位)在电脑中起着重要作用.比如电脑中的部分软件的正常运行就离不 ...
- C++接入CrashRpt并上报分析崩溃信息
项目需要监测在Windows平台的崩溃情况,折腾了两天终于弄好了,记录一下. 1.捕获崩溃信息 接到这个需求,心想应用崩溃系统会收到信号,应该有相应的函数可以监听,上网搜索,果不其然函数 SetUnh ...
- 关于CrashRpt的研究
CrashRpt是轻量级的开源错误报告库 官网 下载链接 ##编译工程 从官网下载下最新版(v.1.4.3_r1645),解压后发现是visual studio的工程,使用的是vs2010.但我用得是 ...
- 捕获Windows C/C++程序异常奔溃工具CrashRpt
背景 在Windows环境下做C/C++程序开发有段时间了,经常遇到程序奔溃时缺无法捕获,经同事推荐,知道了CrashRpt这个捕获C/C++程序异常的工具,让我省去了通过增加打印调试去查询程序异常的 ...
- crashRpt用法
从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置 crashrptDir=D:\work\AIW\WebMicaps\Web ...
最新文章
- 隆重介绍!一款新型基于姿势的人像实例分割框架
- 5.fork和vfork
- html分步调试,一般纯HTML网页的JavaScript的单步执行与调试(以VS2005)
- asp.net 微信企业号办公系统-流程设计--保存与发布
- 使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET
- iOS开发ARC入门和使用
- 数据库mysql中贴换函数_关于一个自定义MYSQL函数,实现点击链接后,在数据库里改变数据的问题。...
- SQLite学习(八) - SQLite C编程接口
- mysql怎么退出时保存导出_Mysql应用使用MySQL MySqldump命令导出数据时的注意事项...
- 手机驱动开发_新加坡科学家开发由智能手机驱动的无电池“智能服装”
- 如何设置linux端口桥接,怎么在linux下配置桥接?
- Ubuntu OpenCV 自定义环境变量 pkg-config / PKGCONFIGPATH
- Markdown编辑器: 语法、Atom、Word、PPT
- 合肥大学c语言试题及答案,合肥工业大学C语言题库程序填空题库2.doc
- 硬盘GPT和MBR分区表转换方法
- visual studio code下载慢解决办法
- ::before和::after伪元素的使用及优惠券案例
- Android 5.1.1源码修改添加白名单和静默安装功能
- 供应链安全、勒索攻击、AI赋能——2022网络安全技术呈何趋势?
- 案例分享 | 如何实践 4 个用户体验设计原则
热门文章
- 全国计算机类竞赛有哪些,数学类和计算机类竞赛有哪些?
- [20][03][71] Log Forging
- mysql查看数据库表空间占用情况
- Elasticsearch 模块-Shard Allocation 机制
- Java 音乐播放器开发学习之——音频文件的播放
- 20189312任方园《网络攻防》第十次作业
- Spring Boot 之groups应对不同的Validation规则自定义
- 小强的HTML5移动开发之路(10)——在线画板
- 番茄花园nbsp;Windowsnbsp;XPnbsp;Pronbsp;SP2nbsp;免激…
- 方方-前端体系课程(一)