/*
* 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 使用实例的更多相关文章

  1. C# 调用第三方DLL完整实例

    C# 调用第三方DLL完整实例 分类: C/C++ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽 ...

  2. 易语言调用外部DLL详细实例教程

    一.准备工作 一.工具:易语言 二.准备一个DLL 1)打开易语言-新建一个Windows动态链接库 2)然后右键新建一个子程序或者用快捷键:Ctrl+N .然后写上代码.我这里写一个 2个字符串拼接 ...

  3. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...

  4. [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar

    Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...

  5. python利用unrar实现rar文件解压缩

    python第三方包unrar可以实现rar文件的解压缩,它以动态库UnRAR为基础,封装而成 1. 下载UnRAR动态库 https://pypi.python.org/pypi/unrar/0.2 ...

  6. DLL编程学习

    原文出处:http://www.blogjava.net/wxb_nudt/archive/2007/09/11/144371.html DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博 ...

  7. DLL和LIB的一些知识点(网上搜集)

    关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib:如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一 ...

  8. Dll的显式和隐式调用

    建立项目,请选择Win32 控制台项目(Win32 Console Application),选择DLL和空项目选项.DLLs可能并不如你想像的那样难.首先写你的头文件(header file):称为 ...

  9. DLL编写教程

    本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar   DLL的优点 简单的 ...

随机推荐

  1. [转]如何解决外边距margin叠加的问题探讨

    两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠,那么如何使元素上下margin不折叠呢?下面的方法或许对大家有所帮助 一.首先你要知道什么情况下会触发:两个或多个毗邻的普通流中的块 ...

  2. Salt安装(yum不可用时)

        salt-master安装   [salt-master]# yum install salt-master   或者 curl -L http://bootstrap.saltstack.o ...

  3. Json.Net的简单使用

    1.添加程序集 Newtonsoft.Json.dll 2.创建模型 public class Person {   public string Name { get; set; }   public ...

  4. $Ajax简单理解

    关于web开发的可能我们不能或缺的利器就是$Ajax,我们这里就不具体的将里面的原理(如果大家有时间的话可以好好的看看javascript里面的权威指南)里面讲的比较详细了 这里就在不说了.今天我们就 ...

  5. <八>JDBC_重构DAO查询方法

    DAO类: import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import ...

  6. *HDU 1068 二分图

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. *HDU1598 并查集

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  8. *HDU1969 二分

    Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. hibernate_Restrictions用法

    方法   说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge &g ...

  10. Ecshop:后台添加新功能栏目以及管理权限设置

    一.添加菜单项 打开 /admin/includes/inc_menu.php文件(后台框架左边菜单),在最后添加一行如下: $modules['17_other_menu']['sns_list'] ...