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 使用百度前必读 | 文库协议

用手机扫此二维码:쎗
以下结果由提供:쎗
百度翻译

百科词条:쎗
百度百科

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

CrashRpt使用相关推荐

  1. 计算机中丢失crashrpt,crashrpt

    手机评站网今天精心准备的是<crashrpt>,下面是详解! crashrpt.exe-应用程序错误,怎么办? 请修复一下系统试试 1.开机按F8进入安全模式后在退出,选重启或关机在开机, ...

  2. 提取CrashRpt中屏幕截图并压缩为zip的功能

    CrashRpt中除了错误处理之外值得学习的地方还是不少的,如屏幕截图.邮件发送. 这里主要提取屏幕截图的功能. 1.从CrashRpt源码目录中分别复制minizip.zlib.libpng到一个目 ...

  3. CrashRpt开源代码使用详解(一):CrashRpt介绍及简单应用

    CrashRpt开源代码使用详解(一):CrashRpt介绍及简单应用 1.简介 CrashRpt是一个开源的第三方包,在程序出现未处理异常时,能够收集错误信息,并生成程序错误报告.CrashRpt可 ...

  4. Windows平台崩溃转储系统crashrpt的使用

    概述 CrashRpt 是一个免费的.轻量级的开源错误报告库开源库,旨在拦截C++程序中的异常,收集有关崩溃的技术信息并通过互联网向软件供应商发送错误报告,用于在 Microsoft Visual S ...

  5. 计算机中丢失crashrpt,crashrpt.dll

    crashrpt.dll是smartFTP中一款重要的dll文件,缺少它将导致软件的部分功能无法实现或者无法启动,如果计算机弹出crashrpt.dll丢失或者找不到crashrpt.dll的问题,下 ...

  6. 计算机中丢失crashrpt,修复crashrpt.dll

    crashrpt.dll是电脑系统必备的一个DLL组件修复程序.系统重要文件 crashrpt.dll .crashrpt.dll(含64位)在电脑中起着重要作用.比如电脑中的部分软件的正常运行就离不 ...

  7. C++接入CrashRpt并上报分析崩溃信息

    项目需要监测在Windows平台的崩溃情况,折腾了两天终于弄好了,记录一下. 1.捕获崩溃信息 接到这个需求,心想应用崩溃系统会收到信号,应该有相应的函数可以监听,上网搜索,果不其然函数 SetUnh ...

  8. 关于CrashRpt的研究

    CrashRpt是轻量级的开源错误报告库 官网 下载链接 ##编译工程 从官网下载下最新版(v.1.4.3_r1645),解压后发现是visual studio的工程,使用的是vs2010.但我用得是 ...

  9. 捕获Windows C/C++程序异常奔溃工具CrashRpt

    背景 在Windows环境下做C/C++程序开发有段时间了,经常遇到程序奔溃时缺无法捕获,经同事推荐,知道了CrashRpt这个捕获C/C++程序异常的工具,让我省去了通过增加打印调试去查询程序异常的 ...

  10. crashRpt用法

    从官网上下载crashRpt的源代码,按说明编译出对应的lib和dll 1 在编译crashRpt的时候,在环境变量中设置  crashrptDir=D:\work\AIW\WebMicaps\Web ...

最新文章

  1. 隆重介绍!一款新型基于姿势的人像实例分割框架
  2. 5.fork和vfork
  3. html分步调试,一般纯HTML网页的JavaScript的单步执行与调试(以VS2005)
  4. asp.net 微信企业号办公系统-流程设计--保存与发布
  5. 使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET
  6. iOS开发ARC入门和使用
  7. 数据库mysql中贴换函数_关于一个自定义MYSQL函数,实现点击链接后,在数据库里改变数据的问题。...
  8. SQLite学习(八) - SQLite C编程接口
  9. mysql怎么退出时保存导出_Mysql应用使用MySQL MySqldump命令导出数据时的注意事项...
  10. 手机驱动开发_新加坡科学家开发由智能手机驱动的无电池“智能服装”
  11. 如何设置linux端口桥接,怎么在linux下配置桥接?
  12. Ubuntu OpenCV 自定义环境变量 pkg-config / PKGCONFIGPATH
  13. Markdown编辑器: 语法、Atom、Word、PPT
  14. 合肥大学c语言试题及答案,合肥工业大学C语言题库程序填空题库2.doc
  15. 硬盘GPT和MBR分区表转换方法
  16. visual studio code下载慢解决办法
  17. ::before和::after伪元素的使用及优惠券案例
  18. Android 5.1.1源码修改添加白名单和静默安装功能
  19. 供应链安全、勒索攻击、AI赋能——2022网络安全技术呈何趋势?
  20. 案例分享 | 如何实践 4 个用户体验设计原则

热门文章

  1. 全国计算机类竞赛有哪些,数学类和计算机类竞赛有哪些?
  2. [20][03][71] Log Forging
  3. mysql查看数据库表空间占用情况
  4. Elasticsearch 模块-Shard Allocation 机制
  5. Java 音乐播放器开发学习之——音频文件的播放
  6. 20189312任方园《网络攻防》第十次作业
  7. Spring Boot 之groups应对不同的Validation规则自定义
  8. 小强的HTML5移动开发之路(10)——在线画板
  9. 番茄花园nbsp;Windowsnbsp;XPnbsp;Pronbsp;SP2nbsp;免激…
  10. 方方-前端体系课程(一)