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的优点 简单的 ...
随机推荐
- [软件推荐]VMware Workstation 12.1.1多国语言(含简体中文)+激活方法
虚拟机VMware功能强大,使用方便,可以在同一台电脑上安装多个系统(Windows.Linux.OS).虚拟机上的所有操作都不会影响到“实体机”,因此在虚拟机中可以进行很多测试操作,如果某些软件使用 ...
- 从Bayesian角度浅析Batch Normalization
前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...
- NSDateFormatter 相关理解
Formatter译为格式,相应的NSDateFormatter就相当于是NSDate的转换类,将NSDate转换为另一种格式,或转换回来.NSDate没有自己的输出,需要借助NSDateFormat ...
- dedecms中调用制定栏目
{dede:type typeid='5'} <li> <a href="[field:typelink/]" target="_blank" ...
- 【JAE】JAE京东云擎部署首个Java应用
前几天一直在寻找好用并且免费的PaaS最终就发现了国内的京东云擎JAE和国外的Heroku.我首先选择的是Heroku,因为他有一个非常强大的eclipse插件 为开发带来了很大的方便.用它提交后的代 ...
- 打包ipa出现问题记录
1.打包ipa事,Archive出现问题 解决方法:Xcode->系统偏好设置->Accounts->选中正在使用的账户->view details->download ...
- Unity学习疑问记录之界面适配
Unity3d UGUI 界面适配 实例解析 三种适配方式 http://www.mamicode.com/info-detail-475563.html
- 【emWin】例程一:emWin系列教程简介
实验指导书及代码包下载: http://pan.baidu.com/s/1bpKbPBx
- Glide加载图片到自定义的圆形ImageView中不显示
当使用自定义的圆形ImageView时,发现使用Glide加载并设置默认初始图片时,自定义的ImageView一直显示默认图片,无法更新到加载的图片. 使用下面代码可以解决这个问题 Glide.wit ...
- OMXplayer播放视频的参数说明
1.OMXplayer支持硬解码,因此是一个非常不错的选择.2.支持格式目前知道的有:MKV.AVI.FLV.MP43.如果想用全屏播放,参数是:-r4.如果想用HDMI输出声音,参数是:-o hdm ...