unrar.dll 使用实例
/*
* 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, , sizeof(RAROpenArchiveData));
char name[] = "./testRar/test.rar";
ArchiveData.ArcName = name; // 打开模式:RAR_OM_LIST或RAR_OM_EXTRACT
// RAR_OM_LIST 只读取文件头,获取一些文件信息,而不解压文件
// RAR_OM_EXTRACT 为检测或者解压缩而打开压缩包
if (Mode == ) {
ArchiveData.OpenMode = RAR_OM_LIST;
} else if (Mode == ){
ArchiveData.OpenMode = RAR_OM_EXTRACT;
} // 输出结果:
// 0成功
// ERAR_NO_MEMORY 内存不足,无法初始化数据结构
// ERAR_BAD_DATA 压缩包头损坏
// ERAR_BAD_ARCHIVE 不是有效的Rar压缩包
// ERAR_UNKNOWN_FORMAT 无法识别的压缩方式
// ERAR_EOPEN 压缩包打开错误
ArchiveData.OpenResult = ;
// 设置存放注释缓冲区,最大不能超过64KB;设为null表示不读取注释
ArchiveData.CmtBuf = NULL;
// 设置缓冲区大小
ArchiveData.CmtBufSize = ;
// 实际读取到的注释大小
ArchiveData.CmtSize = ;
// 输出注释状态:
// 0 注释不存在
// 1 注释读取完毕
// ERAR_NO_MEMORY 内存不足
// ERAR_BAD_DATA 注释损坏
// ERAR_UNKNOWN_FORMAT 注释格式无效
// ERAR_SMALL_BUF 缓冲区过小
ArchiveData.CmtState = ; HANDLE handle = RAROpenArchive(&ArchiveData);
if (ArchiveData.OpenResult != ) {
cout << "解压出错" << endl;
return -;
} // 设置回调函数
RARSetCallback(handle, function, Mode); RARHeaderData headerdata;
int RHCode;
while ((RHCode = RARReadHeader(handle, &headerdata)) == ) { if (Mode == ) {
cout << "解压:" << headerdata.FileName << endl; // 第一个参数:句柄
// 第二个参数:路转方式
// 第三个参数:文件解压路径不带文件名,NULL表示当前路径;这个参数只有在DestName为NULL时才有效
// 第四个参数:文件解压路径带文件名,当第三个参数和第个参数同时设置时,以第四个参数为准
int PFCode = RARProcessFile(handle, RAR_EXTRACT, NULL, NULL);
if (PFCode != ) {
cout << "解压出错" << endl;
break;
}
} if (Mode == ) {
cout << "测试:" << headerdata.FileName << endl;
int PFCode = RARProcessFile(handle, RAR_TEST, NULL, NULL);
if (PFCode != ) {
cout << "解压出错" << endl;
break;
}
}
} if (RHCode == ERAR_BAD_DATA) {
cout << "File Header broken" << endl;
} RARCloseArchive(handle); return ; } // 回调函数
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 -;
case 'R': {
cin >> (char*) P1;
return ;
}
default:
return ;
}
return ;
} // 如果P2为RAR_VOL_NOTIFY则表示,需要的卷找到了,正常打开了,P1指向的就是另一个卷的名称,此时不能修改P1的值
// 此时也有两种操作:
// 一种是直接返回非负数,继续解压过程
// 另一种是返回-1,终止解压过程
if (P2 == RAR_VOL_NOTIFY) {
cout << "\n... volume\n" << (char*) P1 << endl;
return ;
}
return ;
} // 正常的解压过程
// P1指向解压数据的地址
// P2解压数据的大小
case UCM_PROCESSDATA: {
return ;
} // 需要密码才能解压
// P1指向密码缓冲区地址
// P2缓冲区大小
case UCM_NEEDPASSWORD: {
cin >> (char*) P1;
P2 = strlen((char*) P1);
return ;
}
}
}
unrar.dll 使用实例的更多相关文章
- C# 调用第三方DLL完整实例
C# 调用第三方DLL完整实例 分类: C/C++ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽 ...
- 易语言调用外部DLL详细实例教程
一.准备工作 一.工具:易语言 二.准备一个DLL 1)打开易语言-新建一个Windows动态链接库 2)然后右键新建一个子程序或者用快捷键:Ctrl+N .然后写上代码.我这里写一个 2个字符串拼接 ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...
- python利用unrar实现rar文件解压缩
python第三方包unrar可以实现rar文件的解压缩,它以动态库UnRAR为基础,封装而成 1. 下载UnRAR动态库 https://pypi.python.org/pypi/unrar/0.2 ...
- DLL编程学习
原文出处:http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博 ...
- DLL和LIB的一些知识点(网上搜集)
关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib:如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一 ...
- Dll的显式和隐式调用
建立项目,请选择Win32 控制台项目(Win32 Console Application),选择DLL和空项目选项.DLLs可能并不如你想像的那样难.首先写你的头文件(header file):称为 ...
- DLL编写教程
本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar DLL的优点 简单的 ...
随机推荐
- hihoCoder1388 Periodic Signal(2016北京网赛F:NTT)
题目 Source http://hihocoder.com/problemset/problem/1388 Description Profess X is an expert in signal ...
- Linux下面桌面的安装
挂载光盘后配置yum文件,配置后 使用yum grouplist 命令 查看组 用yum install '"GNOM桌面组 输入 init 5 即可进入桌面模式 0 关机 3命令行级 ...
- 对比SerialCommunication和微软的SerialPort,向SerialPort看齐
SerialCommunication是我综合网上看到的代码稍作修改而成的串口通信类,而SerialPort则是C#的System类库的IO目录Ports子目录下的串口通信类.SerialCommun ...
- Slave作为其它Slave的Master时使用
主从配置需要注意的点 (1)主从服务器操作系统版本和位数一致: (2) Master和Slave数据库的版本要一致: (3) Master和Slave数据库中的数据要一致: (4) Master开启二 ...
- Delphi XE6 原生解析json
Delphi XE5带了system.json单元,原生提供了json支持类.下面是解析json用法说明: 最简单的JSON大致像这样 { "date":"周二(今天, ...
- Linux下安装Git
Ubuntu12.04中默认没有安装Git.需要自行安装. 1. 安装Git 1.1 Ubuntu12.04下 可以使用apt-get方式安装,也可以下载源代码安装[1],我们这里使用apt-git安 ...
- SharePoint Configuration Wizard - Unable to upgrade SharePoint Products and Technologies because an upgrade is already in progress
故障描述 当要运行SharePonit Products and Technologies Configuration Wizard的时候,出现了如下图所示的错误提示. 错误信息为: Unable t ...
- apache 自带的ab测试
ab -c 20 -n 2000 http://192.168.1.110:8080/index.php
- 浅谈java抽象类和接口
第一次,写这个,没有把图片放上来,有兴趣的可以点击连接看原文 http://note.youdao.com/noteshare?id=aecbd52b9240f23c0954e8086b848a17 ...
- js的forEach,for in , for of
forEach遍历数组 [].forEach(function(value, index, array) { // ... }); 例子 var myArry =[1,2,3,4]; myArry.d ...