Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup Inno安装程序torrent下载实现_Inno Setup_Pascalscript_Torrent_Aria2_Inno Download Plugin - Fatal编程技术网

Inno setup Inno安装程序torrent下载实现

Inno setup Inno安装程序torrent下载实现,inno-setup,pascalscript,torrent,aria2,inno-download-plugin,Inno Setup,Pascalscript,Torrent,Aria2,Inno Download Plugin,我目前正在使用Inno下载插件为我的安装程序下载文件,最大的问题是它无法正确下载文件。因为很多原因,比如坏的连接。我想添加一个替代方法来下载文件,所以用户可以选择他想要的是常规方式,还是torrent方式。我知道我可以用。有人能帮我把它实现到inno安装程序的代码中吗 我需要的是使用torrent(aria2.exe)下载一个7z文件,然后将内容解压缩到{app}位置中定义的文件夹中 我可能只需要一个好的代码示例。只需运行aria2c,将其输出重定向到一个文件,并轮询文件内容以了解下载进度 这实

我目前正在使用Inno下载插件为我的安装程序下载文件,最大的问题是它无法正确下载文件。因为很多原因,比如坏的连接。我想添加一个替代方法来下载文件,所以用户可以选择他想要的是常规方式,还是torrent方式。我知道我可以用。有人能帮我把它实现到inno安装程序的代码中吗

我需要的是使用torrent(
aria2.exe
)下载一个7z文件,然后将内容解压缩到
{app}
位置中定义的文件夹中


我可能只需要一个好的代码示例。

只需运行
aria2c
,将其输出重定向到一个文件,并轮询文件内容以了解下载进度

这实际上与我的答案非常相似:


#定义磁铁“磁铁:…”
[档案]
资料来源:aria2c.exe;标志:dontcopy
[守则]
函数BufferToAnsi(const Buffer:string):AnsiString;
变量
W:单词;
I:整数;
开始
设置长度(结果、长度(缓冲区)*2);
对于I:=1到长度(缓冲区)do
开始
W:=Ord(缓冲区[I]);
结果[(I*2)]:=Chr(W shr 8);{高字节}
结果[(I*2)-1]:=Chr(字节(W));{低字节}
结束;
结束;
函数设置计时器(
Wnd:LongWord;IDEvent,Elapse:LongWord;TimerFunc:LongWord):LongWord;
外部的SetTimer@user32.dllstdcall';
函数KillTimer(hWnd:LongWord;uIDEvent:LongWord):BOOL;
外部的KillTimer@user32.dllstdcall';
变量
ProgressPage:TOutputProgressWizardPage;
ProgressFileName:string;
过程UpdateProgressProc(
H:LongWord;Msg:LongWord;Event:LongWord;Time:LongWord);
变量
S:翻译;
I:整数;
L:整数;
P:整数;
Max:整数;
进展:字符串;
缓冲区:字符串;
流:TFileStream;
转移:字符串;
百分比:整数;
发现:布尔型;
开始
发现:=假;
尝试
{需要共享读取,因为输出文件已锁定以进行写入,}
{所以我们不能使用LoadStringFromFile}
Stream:=TFileStream.Create(ProgressFileName、fmOpenRead或fmsharedynone);
尝试
L:=流的大小;
最大值:=100*2014;
如果L>最大值,则
开始
流位置:=L-最大值;
L:=最大值;
结束;
设置长度(缓冲区,(第2部分)+(第2部分);
Stream.ReadBuffer(Buffer,L);
S:=BufferToAnsi(缓冲区);
最后
免费;
结束;
如果S='',那么
开始
日志(格式('进度文件%s为空',[ProgressFileName]);
结束;
除了
日志(格式('从文件%s读取进度失败',[ProgressFileName]);
结束;
如果是“”,那么
开始
P:=Pos(“[#”,S);
如果P=0,则
开始
日志(“未找到任何进度线”);
结束
其他的
开始
重复
删除(S,1,P-1);
P:=Pos(']',S);
进度:=副本(S,2,P-2);
删除(S,1,P);
P:=Pos(“[#”,S);
直到(P=0);
日志(格式('找到的进度行:%s',[进度]);
P:=位置('',进度);
如果P>0,则
开始
日志('A');
删除(进度,1,P);
P:=Pos(“(”,Progress);
如果P>0,则
开始
日志('b');
转移:=副本(进度,1,P-1);
删除(进度,1,P);
P:=Pos(“%”),进度);
如果P>0,则
开始
对数('c');
百分比:=StrToIntDef(复制(进度,1,P-1),-1);
如果百分比>=0,则
开始
日志(格式('已传输:%s,百分比:%d',[已传输,百分比]);
进度页面。设置进度(百分比,100);
SetText(格式('Transferred:%s',[Transferred]),'';
发现:=真;
结束;
结束;
结束;
结束;
结束;
结束;
如果没有找到的话
开始
日志(“未找到新数据”);
{没有新的进度数据,至少泵送消息队列}
ProgressPage.SetProgress(ProgressPage.ProgressBar.Position,100);
结束;
结束;
函数PrepareToInstall(var NeedsRestart:Boolean):字符串;
变量
TorrentDownloaderPath:string;
TempPath:字符串;
命令行:字符串;
定时器:长字;
InstallError:字符串;
结果代码:整数;
S:翻译;
开始
提取临时文件('aria2c.exe');
进度页:=
CreateOutputProgressPage(“Torrent下载”、“下载Torrent…”);
ProgressPage.SetProgress(01100);
ProgressPage.Show;
尝试
Timer:=SetTimer(0,0250,CreateCallback(@UpdateProgressProc));
TempPath:=ExpandConstant('{tmp}');
TorrentDownloaderPath:=TempPath+'\aria2c.exe';
ProgressFileName:=ExpandConstant('{tmp}\progress.txt');
日志(格式('ProgressFileName',预期进度为%s');
命令行:=
格式(“%s”“%s”“>%s”“[
TorrentDownloaderPath,“{#TorrentMagnet}”,ProgressFileName]);
日志(格式('Executing:%s',[CommandLine]);
命令行:=格式('/C“%s”,[CommandLine]);
如果不是Exec(ExpandConstant({cmd}')、命令行、TempPath、SW_HIDE、,
EWWAIT未过滤,结果代码)然后
开始
结果:='无法启动torrent下载';
结束
其他的
如果结果代码为0,则
开始
LoadStringFromFile(ProgressFileName,S);
结果:=格式('Torrent下载失败,代码为%d',[ResultCode]);
日志(结果);
日志('输出:'+S);
结束;
最后
{清理}
KillTimer(0,Timer);
进行页面隐藏;
删除文件(ProgressFileName);
结束;
结束;
对于,您需要Inno Setup 6。如果您一直使用Inno Setup 5,则可以使用库中的
WrapCallback
函数


BufferToAnsi
及其使用基于: