搜索
查看: 409|回复: 8
打印 上一主题 下一主题

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

[复制链接]

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
跳转到指定楼层
楼主
发表于 2018-1-5 18:11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
7z有一个神奇的特性,
就是你可以把压缩包追加在EXE文件后面,然后他依然可以正常的解压。

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




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

解压程序非常简单简单,主要代码如下
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

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

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

评分

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

查看全部评分

回复

使用道具 举报

3

主题

14

帖子

75

积分

一级会员

Rank: 2

积分
75
沙发
发表于 2018-1-5 18:43:53 | 只看该作者
感谢Jacen分享,受益匪浅,刚好在弄绿色解压包谢谢
回复

使用道具 举报

3

主题

14

帖子

75

积分

一级会员

Rank: 2

积分
75
板凳
发表于 2018-1-5 20:15:14 | 只看该作者
jacen大大,解压过程中移动窗口会造成程序死掉,是否必须要多线程才行?
回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
地板
 楼主| 发表于 2018-1-5 22:12:03 | 只看该作者
吃虫子的橙 发表于 2018-1-5 20:15
jacen大大,解压过程中移动窗口会造成程序死掉,是否必须要多线程才行?


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

使用道具 举报

3

主题

14

帖子

75

积分

一级会员

Rank: 2

积分
75
5#
发表于 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=
大大能帮我看下么?我看了您的教程,特地按照教程里的代码实验了下确实成功了。但是放我自己这里调用解压就没反应了
回复

使用道具 举报

3

主题

14

帖子

75

积分

一级会员

Rank: 2

积分
75
6#
发表于 2018-1-5 22:19:38 | 只看该作者
Jacen.He 发表于 2018-1-5 22:12
你可以在解压回调中加上 win.delay(1),响应一下用户的拖动操作,
你要用多线程当然也可以。

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

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

使用道具 举报

3

主题

14

帖子

75

积分

一级会员

Rank: 2

积分
75
7#
发表于 2018-1-5 22:24:15 | 只看该作者
不好意思Jacen大大,因为今天没事一直在折腾这个,所以。。
您有事就先忙吧,不用特意解答的,有空再说
很感谢您晚上的帮忙,THANKYOU
回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
8#
 楼主| 发表于 2018-1-5 22:27:59 | 只看该作者
吃虫子的橙 发表于 2018-1-5 22:24
不好意思Jacen大大,因为今天没事一直在折腾这个,所以。。
您有事就先忙吧,不用特意解答的,有空再说
...

建议你看一下开始页的入门教程
http://bbs.aardio.com/forum.php? ... 625&from=portal
里面开头就有讲到这个原理,和解决方法。

大家注意看入门教程,可以提高解决问题的效率,避免浪费不必要的时间
回复

使用道具 举报

143

主题

2132

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11783
9#
 楼主| 发表于 2018-1-6 07:30:30 | 只看该作者
更新了代码,耗时循环建议加 win.peekPumpInputMessage() 速度快一些。
win.delay(0) 稍慢,win.delay(1) 更慢,如果循环的时间很短可以加 win.delay(1)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2018-1-19 17:32 , Processed in 0.078125 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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