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中屏幕截图并压缩为zip的功能相关推荐

  1. 在 macOS 中使用密码保护压缩(zip)文件

    zip -e archivename.zip filetoprotect.txt zip -er archive.zip /path/to/directory/ unzip filename.zip

  2. 关于Centos中在线解压文件名中有中文字符出现乱码的终极解决方法 unar 我的压缩文件.zip

    本帖最后由 hsxnet 于 2018-2-4 16:14 编辑 关于Centos中在线解压文件名中有中文字符出现乱码的终极解决方法(亲测总结): 记录一下我测试的笨办法,以备自己日后查询: 一.从C ...

  3. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

  4. apache zip java_java中ant包中的org.apache.tools.zip实现压缩和解压缩

    其实apache中的ant包(请自行GOOGLE之ant.jar)中有一个更好的类,已经支持中文了,我们就不重复制造轮子了,拿来用吧, 这里最主要的功能是实现了 可以指定多个文件 到同一个压缩包的功能 ...

  5. linux中的grep 过滤查找及“|”管道符、gzip/gunzip 压缩、zip/unzip 压缩

    1.7.3 grep 过滤查找及"|"管道符 管道符,"|",表示将前一个命令的处理结果输出传递给后面的命令处理 grep 选项 查找内容 源文件 选项 功能 ...

  6. java压缩zip文件夹错误_Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题)...

    项目场景: Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题) 问题描述: 最近的项目需要将多级文件夹压缩成zip,网上找了几个工具类,都会报错,所以 ...

  7. Linux中tar归档命令、zip压缩、gzip压缩、bzip2压缩

    tar:归档,把多个文件整和在一起,常常用在备份上面,本身不具备压缩功能,但是可以指定其他压缩功能去压缩. 目录 一. tar命令的基本使用 1.常用命令选项 二.zip压缩命令的使用 1.常用命令选 ...

  8. Python提取PPT中的图片

    一.前言 今天要带大家实现的是PPT图片的提取.在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到别人的模板或者素材,这个时候提取PPT图片就可以减少我们很多工作 ...

  9. php使用ZipArchive扩展实现文件的zip压缩与zip解压

    ZipArchive 是PHP自带的zip扩展类,可以实现对文件或目录实现ZIP文件的压缩和解压,使用前首先要确保PHP ZipArchive扩展已经开启,以下代码亲测可用,但对中文命名的文件不兼容 ...

最新文章

  1. 响应式网站建设优势有哪些?
  2. cxGrid 使用指南 1
  3. go语言使用go-sciter创建桌面应用(八) 窗口显示时,自动加载后端数据。
  4. leetcode 52. N皇后 II(回溯)
  5. ASH的适用场景和常见用法(附2个经典案例)
  6. java 跨平台很鸡肋,Mac 篇八:Mac上的这个软件看起来很鸡肋,其实很牛很强大
  7. Hive collect、explode函数详解(包括concat、Lateral View)
  8. 我的前半生之十一,创业维艰,人生百态
  9. hdu5285-wyh2000 and pupil-(染色法二分图判定)
  10. 机器学习_第四天(线性回归+岭回归+逻辑回归)
  11. js vue+elementui 全屏跟退出全屏功能搬砖
  12. vivo oppo 手机手机调试无法启动
  13. vue 拍照和上传图片
  14. 亿愿数据库文章中医中药知识宝库阅读器
  15. pikachu通关教程~~~~
  16. 如何批量删除word中的中文和标点符号(word删除中文所有标点符号)
  17. 手写板比较(可能不该发到这里)
  18. 通达信指标源码,一键自动改写成选股器
  19. 创业能成功的通常是哪几种人
  20. Qt Quick QML

热门文章

  1. 怎样做一个好的程序员——好文共赏
  2. 最新骨骼动画的演示程序。
  3. 【异地恋最怕的不是变心,而是慢慢的不知道怎么了,感情就不在了——早上醒来,又看见一对异地恋人发出的日志,仅仅45天,一年多的感情就这样崩塌……】 这是我看过最好的一篇异地文章!
  4. cocos2dx游戏开发中的问题
  5. CALL是如何炼成的之ECX对象指针的应用
  6. IDA 函数出现翻出来漏掉很多代码 或者出现jumpout 的处理方法之一
  7. 刘江高满堂联手陈宝国担纲 顶级配置展《老酒馆》传奇
  8. pdf.js javascript实现pdf阅读器
  9. 打印机墨水添加方法(一)
  10. 德军总部2新巨人计算机丢失,德军总部2新巨人 vulkan-1.dll丢失解决办法