/*
* 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. Only Link: Inheritance — private and protected inheritance in c++

    reading note link: https://isocpp.org/wiki/faq/private-inheritance

  2. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

  3. PHP mysql基础操作

    mysql连接操作 //建立连接$con = mysql_connect('localhost', 'root', '123456');//判断是否连接成功if($con){ die('连接失败!'. ...

  4. ZeroMQ接口函数之 :zmq_send_const – 从一个socket上发送一个固定内存数据

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...

  5. Android 双卡双待识别

    简介 Android双卡双待已经越来越普及了,解决双卡双待管理是广大手机开发人员必须得面对的问题,为实现Android平台的双卡双待操作,笔者研究了Android 应用层操作双卡双待的机制. 机制 获 ...

  6. TweenMax参数说明

    TweenMax 建立在 TweenLite 和 TweenFilterLite 基础之上,因此,又揉合了这二者的功能,使得功能更加的齐备,但是如果说易用性,觉得还是 TweenLite 来得方便一些 ...

  7. PHP 数组的拷贝是按值传递 or 按引用传递

    在记忆中 PHP 简单变量的拷贝是按值传递,数组和对象的拷贝是按引用传递,即通过引用来实现. 简单变量和对象好理解: <?php // 简单变量的拷贝 $a = 'human'; $b = $a ...

  8. 引用log4j.jar包后,出现告警

    问题现象:在引用log4j包后,使用自己导出的jar包,编译测试例代码,在启动浏览器时出现以下告警:log4j:WARN No appenders could be found for logger ...

  9. FTP传输文件

    感谢其他技术人员的分享.我转发,添加个人使用. public class TransFTP {/// <summary> /// 上传文件 /// </summary> /// ...

  10. (转)微信小程序破解IDE

    1.IDE下载 微信web开发者工具,本人是用的windows 10 x64系统,用到以下两个版本的IDE安装工具与一个破解工具包: wechat_web_devtools_0.7.0_x64.exe ...