unrar.dll 使用实例
2015-08-20 10:13
267 查看
/* * main.cpp * * Created on: Aug 17, 2015 * Author: smallcroco * * Discription: * 1 首先打开解压包,可以设置打开方式,获得句柄; * RAROpenArchive函数,需要RAROpenArchiveData结构体 * 或者 * RAROpenArchiveEx函数,需要RAROpenArchiveDataEx结构体 * * 2 然后设置回调函数; * RARSetCallback函数,需要设置回调函数 * * 3 读取文件头,并判断是否解压完成; * RARReader函数,需要RARHeaderData结构体 * 或者 * RARReaderEx函数,需要RARHeaderDataEx结构体 * * 4 跳到下一个文件; * RARProcessFile函数 * 或者 * RARProcessFileW函数 * * 5 关闭句柄; * RARCloseArchive函数 */ #include <cstdio> #define _UNIX #include <string.h> #include <iostream> #include "dll.hpp" using namespace std; typedef int function(unsigned int msg, long int UserData, long int P1, long int P2); int main() { cout<<"请输入解压模式:"<<endl; cout<<"读取文件头不解压,输入:1"<<endl; cout<<"解压文件,输入:2"<<endl; long Mode; cin>>Mode; // 打开压缩包 RAROpenArchiveData ArchiveData; memset(&ArchiveData, 0, sizeof(RAROpenArchiveData)); char name[] = "./testRar/test.rar"; ArchiveData.ArcName = name; // 打开模式:RAR_OM_LIST或RAR_OM_EXTRACT // RAR_OM_LIST 只读取文件头,获取一些文件信息,而不解压文件 // RAR_OM_EXTRACT 为检测或者解压缩而打开压缩包 if (Mode == 1) { ArchiveData.OpenMode = RAR_OM_LIST; } else if (Mode == 2){ ArchiveData.OpenMode = RAR_OM_EXTRACT; } // 输出结果: // 0成功 // ERAR_NO_MEMORY 内存不足,无法初始化数据结构 // ERAR_BAD_DATA 压缩包头损坏 // ERAR_BAD_ARCHIVE 不是有效的Rar压缩包 // ERAR_UNKNOWN_FORMAT 无法识别的压缩方式 // ERAR_EOPEN 压缩包打开错误 ArchiveData.OpenResult = 0; // 设置存放注释缓冲区,最大不能超过64KB;设为null表示不读取注释 ArchiveData.CmtBuf = NULL; // 设置缓冲区大小 ArchiveData.CmtBufSize = 0; // 实际读取到的注释大小 ArchiveData.CmtSize = 0; // 输出注释状态: // 0 注释不存在 // 1 注释读取完毕 // ERAR_NO_MEMORY 内存不足 // ERAR_BAD_DATA 注释损坏 // ERAR_UNKNOWN_FORMAT 注释格式无效 // ERAR_SMALL_BUF 缓冲区过小 ArchiveData.CmtState = 0; HANDLE handle = RAROpenArchive(&ArchiveData); if (ArchiveData.OpenResult != 0) { cout << "解压出错" << endl; return -1; } // 设置回调函数 RARSetCallback(handle, function, Mode); RARHeaderData headerdata; int RHCode; while ((RHCode = RARReadHeader(handle, &headerdata)) == 0) { if (Mode == 1) { cout << "解压:" << headerdata.FileName << endl; // 第一个参数:句柄 // 第二个参数:路转方式 // 第三个参数:文件解压路径不带文件名,NULL表示当前路径;这个参数只有在DestName为NULL时才有效 // 第四个参数:文件解压路径带文件名,当第三个参数和第个参数同时设置时,以第四个参数为准 int PFCode = RARProcessFile(handle, RAR_EXTRACT, NULL, NULL); if (PFCode != 0) { cout << "解压出错" << endl; break; } } if (Mode == 2) { cout << "测试:" << headerdata.FileName << endl; int PFCode = RARProcessFile(handle, RAR_TEST, NULL, NULL); if (PFCode != 0) { cout << "解压出错" << endl; break; } } } if (RHCode == ERAR_BAD_DATA) { cout << "File Header broken" << endl; } RARCloseArchive(handle); return 0; } // 回调函数 int function(unsigned int msg, long int UserData, long int P1, long int P2) { switch (msg) { // 表示解压多个卷的压缩包 case UCM_CHANGEVOLUME: { // 如果P2为RAR_VOL_ASK,则表示需要的一个卷找不到,例如几个分卷不在同一文件夹下 // 需要的卷名称为P1指向的字符串。 // 此时有两种解决办法,一种是把需要的卷路径(带卷名称)赋值给P1,然后返回一个非负数,解压继续 // 另一种办法就是直接返回-1,终止解压过程 if (P2 == RAR_VOL_ASK) { cout << "\n\nVolume " << (char*) P1 << "is required\n" << "Possible options:\n" << endl; cout << "\nEnter - try again" << endl; cout << "'R' -specify a new volume name" << endl; cout << "'Q' -quit" << endl; cout << "Enter your choice:" << endl; switch (getchar()) { case 'Q': return -1; case 'R': { cin >> (char*) P1; return 0; } default: return 0; } return 0; } // 如果P2为RAR_VOL_NOTIFY则表示,需要的卷找到了,正常打开了,P1指向的就是另一个卷的名称,此时不能修改P1的值 // 此时也有两种操作: // 一种是直接返回非负数,继续解压过程 // 另一种是返回-1,终止解压过程 if (P2 == RAR_VOL_NOTIFY) { cout << "\n... volume\n" << (char*) P1 << endl; return 0; } return 0; } // 正常的解压过程 // P1指向解压数据的地址 // P2解压数据的大小 case UCM_PROCESSDATA: { return 0; } // 需要密码才能解压 // P1指向密码缓冲区地址 // P2缓冲区大小 case UCM_NEEDPASSWORD: { cin >> (char*) P1; P2 = strlen((char*) P1); return 0; } } }
相关文章推荐
- Effective Objective-C 2.0 第3条:多用字面量语法,少用与之等价的方法
- BAT及各大互联网公司2014前端笔试面试题--Html,Css篇
- 01-复杂度2. Maximum Subsequence Sum (25)
- Linux做简单路由器
- Tomcat 7.0.63启动报错
- Python正则表达式指南
- openwrt mjpeg-stream使用
- JOptionPane类提示框的一些常用的方法
- powerdesigner导出sql
- 【iOS开发技术】NSPredicate谓词的用法 数组过滤
- DropDownList查询&Input(Checkbox)查询
- 杭电2112(SPFA)
- cuda 初学大全
- __attribute__((visibility("default")))
- nginx 部署
- 平方根的异常
- PHP 大图片操作导致内存崩溃及超时的问题
- VS2013中如何解决error C4996: 'fopen'问题
- IOS谓词--NSPredicate
- dedecms 忘记后台密码