aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 22967|回复: 7

分分钟写个7z自解压程序 - 带上漂亮界面可以用来做安装向导

[复制链接]

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-1-5 18:11:33 | 显示全部楼层 |阅读模式
7z有一个神奇的特性,
就是你可以把压缩包追加在EXE文件后面,然后他依然可以正常的解压。

曾经用这个代码写过很多其他软件的安装包,有用plus控件做的,也有htmlayout做的,
如果一个程序本身是用HTMLayout做的,还可以在自解压程序中直接调用EXE中已经有的HTMLayout组件。
这样做出来的界面非常漂亮,而且文件也很小,大家可以试试,比NSIS什么的强悍多了。

7z.jpg


示例源码下载: 7z自解压完整源码.7z (127.95 KB, 下载次数: 1913)

解压程序非常简单简单,主要代码如下
import win.ui;
/*DSG{{*/
var winform = win.form(text="7z自解压演示";right=670;bottom=300;image=$"\res\bg.jpg";max=false;min=false;parent=...)
winform.add(
pie={cls=
"plus";text="100%";left=39;top=22;right=323;bottom=284;background="\res\pie-bg.png";clipBk=false;color=16777215;font=LOGFONT(h=-24);foreRepeat="center";foreground="\res\pie.png";repeat="center";z=1}
)
/*}}*/

//设置扇形进度条范围
winform.pie.setPieRange(1,100);
winform.show();

import sevenZip.decoder2;
var archive = sevenZip.decoder2();
archive.open( io._exepath )

//设置解压进度
archive.extractSetCompleted = function(lowSize,hiSize,percent){
    winform.pie.text = percent +
"%";
    winform.pie.progressPercentage = percent;
    win.peekPumpInputMessage();
}
archive.extract(
"/")

win.loopMessage();


然后我们可以在工程下面的 \.build\工程名字.main.aardio 这个文件中添加一个触发器,
在发布EXE完成以后,立即自动添加文件并压缩EXE文件,触发器里的代码如下:
import ide;
import ide.upx;
ide.upx.compress( ide.getPublishPath() );
//首先调用upx压缩EXE

import console
import fsys.dlg;
import sevenZip.cmd;
sevenZip.cmd.compress(
    fsys.dlg.opendir(,,
"请选择要压缩到EXE中的目录")
    , ide.getPublishPath() , console.log
    )
   
console.log(
"压缩完成")
;
  

因为7z压缩的代码只是在开发环境里才需要执行,所以我们直接调用7z的命令行来压缩文件。
曾经用这个方法写过很多的安装程序,大家可以试试。

评分

参与人数 1 +90 收起 理由
popdes + 90 很给力!

查看全部评分

5

主题

13

回帖

106

积分

一级会员

积分
106
发表于 2018-1-5 18:43:53 | 显示全部楼层
感谢Jacen分享,受益匪浅,刚好在弄绿色解压包谢谢

5

主题

13

回帖

106

积分

一级会员

积分
106
发表于 2018-1-5 20:15:14 | 显示全部楼层
jacen大大,解压过程中移动窗口会造成程序死掉,是否必须要多线程才行?

166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2018-1-5 22:12:03 | 显示全部楼层
吃虫子的橙 发表于 2018-1-5 20:15
jacen大大,解压过程中移动窗口会造成程序死掉,是否必须要多线程才行?


你可以在解压回调中加上 win.delay(1),响应一下用户的拖动操作,
你要用多线程当然也可以 - 但应当没必要。一般7z解压过程都很快,不处理也没有多大关系。

5

主题

13

回帖

106

积分

一级会员

积分
106
发表于 2018-1-5 22:15:13 | 显示全部楼层
Jacen.He 发表于 2018-1-5 22:12
你可以在解压回调中加上 win.delay(1),响应一下用户的拖动操作,
你要用多线程当然也可以。

谢谢大大,主要是这个不小心点到也会没反映,只要解决这个就没其他问题了
http://bbs.aardio.com/forum.php? ... id=22127&extra=
大大能帮我看下么?我看了您的教程,特地按照教程里的代码实验了下确实成功了。但是放我自己这里调用解压就没反应了

5

主题

13

回帖

106

积分

一级会员

积分
106
发表于 2018-1-5 22:19:38 | 显示全部楼层
Jacen.He 发表于 2018-1-5 22:12
你可以在解压回调中加上 win.delay(1),响应一下用户的拖动操作,
你要用多线程当然也可以。

加上延迟参数后可以了。感谢大大帮忙,非常感激

今天弄了一天这个。总算对AARDIO有点熟悉了。哈哈,真心好用

166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2018-1-6 07:30:30 | 显示全部楼层
更新了代码,耗时循环建议加 win.peekPumpInputMessage() 速度快一些。
win.delay(0) 稍慢,win.delay(1) 更慢,如果循环的时间很短可以加 win.delay(1)

1

主题

5

回帖

46

积分

新手入门

积分
46
发表于 2018-1-27 02:38:44 | 显示全部楼层
谢谢楼主的分享,新人正在学习中。谢谢楼主提供的代码,对我的自己做的一款小软件很有帮助。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-1-14 13:23 , Processed in 0.066350 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表