顽固不化
发表于 2010-1-21 20:08:28
如果要效仿2楼的办法的话,建议在WHILE循环里加以个sleep(500),设置一个记载上次STDOUT数据的变量,每次循 ...
7Z的命令行,有个参数-so: write data to stdout,没查到怎么使用,怀疑可以用来屏显,不知可利用否?
llztt 发表于 2010-1-21 18:53 http://www.autoitx.com/images/common/back.gif
这个开关把数据解到一个文件里,相当于生成一个没有压缩的7z文件。
lchl0588
发表于 2010-1-21 20:11:15
貌似你写过7Z自解压的软件吧如炮制法!!
顽固不化
发表于 2010-1-21 20:37:09
貌似你写过7Z自解压的软件吧如炮制法!!
lchl0588 发表于 2010-1-21 20:11 http://www.autoitx.com/images/common/back.gif
哈哈,那是使用现成的SFX。
rolaka
发表于 2010-1-21 21:21:56
autoit官网上有不用dll的纯au3解压udf...
直接用没有sleep的while试试看- - 跳的快 缓存区里积压的原因把?
顽固不化
发表于 2010-1-21 22:07:51
本帖最后由 顽固不化 于 2010-1-22 10:33 编辑
看了调用7zDLL的办法,基本确定可以解决进度条的问题了,里面的例子_7ZIPExtractEx_Example_using_Callback.au3:#include <GuiConstantsEx.au3>
#include <7Zip.au3>
$hGUI = GUICreate("_7ZIPExtractEx demo", 300, 200)
$ctlEdit = GUICtrlCreateEdit("", 10, 10, 280, 100)
$ctlProgress = GUICtrlCreateProgress(10, 130, 280, 20)
$ctlButton_Pack = GUICtrlCreateButton("Unpack!", 10, 167, 75, 23)
$ctlButton_Close = GUICtrlCreateButton("Close", 215, 167, 75, 23)
GUISetState()
$ArcFile = FileOpenDialog("Select archive", "", "Archive Files (*.7z;*.zip;*.gzip;*.bzip2;*.tar;*.rar)", 1, "", $hGUI)
If @error Then Exit
$sOutput = FileSelectFolder("Select output folder", "", 1, "", $hGUI)
If @error Then Exit
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE, $ctlButton_Close
Exit
Case $ctlButton_Pack
$retResult = _7ZipSetOwnerWindowEx($hGUI, "_ARCHIVERPROC")
If $retResult = 0 Then Exit MsgBox(16, "_7ZipAdd demo", "Error occured")
$retResult = _7ZIPExtractEx($hGUI, $ArcFile, $sOutput, 1)
If @error = 0 Then
MsgBox(64, "_7ZIPExtractEx demo", "Archive unpacked successfully", 0, $hGUI)
Else
MsgBox(64, "_7ZIPExtractEx demo", "Error occurred", 0, $hGUI)
EndIf
GUICtrlSetData($ctlProgress, 0)
GUICtrlSetData($ctlEdit, "")
EndSwitch
WEnd
Func _ARCHIVERPROC($hWnd, $Msg, $nState, $ExInfo)
Local $iFileSize, $iWriteSize, $iPercent = 0
If $nState = 0 Then
Local $EXTRACTINGINFO = DllStructCreate($tagEXTRACTINGINFO, $ExInfo)
GUICtrlSetData($ctlEdit, DllStructGetData($EXTRACTINGINFO, "szSourceFileName") & @CRLF, 1)
$iFileSize = DllStructGetData($EXTRACTINGINFO, "dwFileSize")
$iWriteSize = DllStructGetData($EXTRACTINGINFO, "dwWriteSize")
$iPercent = Int($iWriteSize / $iFileSize * 100)
GUICtrlSetData($ctlProgress, $iPercent)
Return 1
EndIf
If $nState = 2 Then GUICtrlSetData($ctlProgress, 100)
Return 1
EndFunc所用的7-zip32.dll是3.11版,4.65版不行,要报错的。(已更换到能用的4.31)
附7Z_udf和7-zip32.dll更大家学习。结贴~~~~~~
rolaka
发表于 2010-1-21 22:11:30
看了调用7zDLL的办法,基本确定可以解决进度条的问题了,里面的例子_7ZIPExtractEx_Example_using_Callback ...
顽固不化 发表于 2010-1-21 22:07 http://autoitx.com/images/common/back.gif
+ + 就是这个东西 不过这个是带dll的 0 0
顽固不化
发表于 2010-1-21 22:14:13
+ + 就是这个东西 不过这个是带dll的 0 0
rolaka 发表于 2010-1-21 22:11 http://www.autoitx.com/images/common/back.gif
还有不带的?没继续找,谢谢你啦,我有空再找找。
非典男人
发表于 2010-1-21 22:27:05
楼主解决了吗说下怎么解决的啊
顽固不化
发表于 2010-1-21 22:29:59
楼主解决了吗说下怎么解决的啊
非典男人 发表于 2010-1-21 22:27 http://www.autoitx.com/images/common/back.gif
只针对7z解压的。不需要命令行了,直接调DLL解压。应该说不存在回显问题了。
remme
发表于 2010-1-21 23:46:52
提供一个邪恶的思路:
根据文件大小估算7z的压缩时间,然后滚动进度条,剩最后一格的时候停滞,等判断压缩完毕后进度条也随之走完。
嘎嘎嘎嘎。。。。。。。
顽固不化
发表于 2010-1-22 09:28:57
提供一个邪恶的思路:
根据文件大小估算7z的压缩时间,然后滚动进度条,剩最后一格的时候停滞,等判断压 ...
remme 发表于 2010-1-21 23:46 http://www.autoitx.com/images/common/back.gif
这个思路也是不错的。
bob
发表于 2010-1-22 10:29:01
老革命碰到新问题
:face (24):
xlcwxl
发表于 2010-1-23 18:15:14
高深
:face (35):
catcher
发表于 2010-1-23 21:04:47
:face (7):看不懂,先收
skyfree
发表于 2010-1-24 08:27:17
一般是使用7ZSFX,而不是使用AU3接收解压进度