论坛风格切换切换到宽版
  • 7278阅读
  • 20回复

外部文件加密(压缩档) [复制链接]

上一主题 下一主题
离线sidelee72
 

发帖
29
金钱
290
威望
29
只看楼主 倒序阅读 0 发表于: 2013-03-31

接承上一帖子:http://bbs.hanzify.org/read-htm-tid-97183.html


我决定采用外部文件(压缩档)的方式来解决这个问题
翻了几页找了这个帖子(http://bbs.hanzify.org/read-htm-tid-49699.html) [INNO 示例脚本] 如何创建带外部文件的安装程序
但是UNZIPW32.DLL 没有加密档案的功能(?) ,于是我想再找其他的plugin来实现档案加密
试了试 is7zv1.01 的 example,(如附件 is7zv1.01.rar (279 K) 下载次数:10 ) 弄不清楚他是如何运作的,一直得到"Invalid password!"



想请教版上有用过 is7z 的高手,该怎么把http://bbs.hanzify.org/read-htm-tid-97183.html 中使用的UNZIPW32.DLL 整合为 is7z.dll
是否可以保留 is7z 原有的进度条?
或是有类似 is7z 这样提供加密压缩功能的plugin?
谢谢!
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2013-03-31
我觉得示例是很清楚了的,测试没有发现问题。Extract7z 的最后一个参数是解压密码。
保留 is7z 原有的进度条 ” 是什么意思?

离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 2 发表于: 2013-03-31
虎大可否做一个简单的实例解说一下
我对这 pascal 实在很不熟,已经摸了一下午
还是没搞懂

我所谓进度条指的是
http://bbs.hanzify.org/read-htm-tid-49699.html 这个使用 UNZIPW32 的例子里
安装进度条并不会显示档案解压缩的部分

是否 is7z 移植到该试例中可以正确显示解压缩进度条

感谢!


离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 3 发表于: 2013-03-31
第二个进度条显示的是解压外部文件 1.7z 文件的进度。
当然你也可以不用第二个进度条,而是直接在原来的第一个进度条中显示解压 1.7z 文件的进度。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2013-03-31

[Files]
Source: is7z.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
var
ProgressBar : TNewProgressBar;
ExtractFile:TNewStaticText;
Button1:TButton;

procedure Extract7z (hWnd, hpb, hst: THandle; fpath, extractPath, pass:PAnsiChar); external 'Extract7z@files:is7z.dll stdcall';

procedure CancelExtract; external 'CancelExtract@files:is7z.dll stdcall';

procedure InitializeWizard();
begin
  ProgressBar := TNewProgressBar.Create(WizardForm);
  ExtractFile:=TNewStaticText.Create(WizardForm);
  with WizardForm.ProgressGauge do
    begin
      ProgressBar.Left := Left;
      ProgressBar.Top := Top + ScaleX(55);
      ProgressBar.Width := Width;
      ProgressBar.Height := Height;
      ProgressBar.Parent := WizardForm.InstallingPage;
      ProgressBar.max := 100;
      ProgressBar.Position := 0;
      ExtractFile.parent:= WizardForm.InstallingPage;
      ExtractFile.autosize:= false;
      ExtractFile.Width := Width;
      ExtractFile.top:=Top + ScaleX(35);
      ExtractFile.caption:='解压 7zip';
    end;
end;

procedure Button1OnClick(Sender: TObject);
begin
CancelExtract;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep=ssPostInstall then
   begin
    Button1:=TButton.create(WizardForm);
    Button1.parent:=WizardForm;
    Button1.width:=135;
    Button1.caption:='取消解压';
    Button1.left:=260;
    Button1.top:=WizardForm.cancelbutton.top;
    Button1.OnClick:=@Button1OnClick;
    try
     Extract7z (wizardform.handle, progressbar.handle, ExtractFile.handle, ExpandConstant('{src}') + '\1.7z', ExpandConstant('{app}'), 'mypass');    // 外部文件 1.7z,最后这个参数是它的解压密码
     Button1.visible:=false;
    except
     MsgBox('密码错误!', mbInformation, MB_OK);
     Button1.visible:=false;
    end;
   end;
end;


上面的例子中,外部文件为 1.7z,它位于安装程序 setup.exe 所在的文件夹。1.7z 文件的解压密码是 mypass



离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 5 发表于: 2013-03-31
不添加第二个进度条,而是直接在原来第一个进度条中显示解压外部文件进度的代码:


[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: is7z.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
var
Button1:TButton;

procedure Extract7z (hWnd, hpb, hst: THandle; fpath, extractPath, pass:PAnsiChar); external 'Extract7z@files:is7z.dll stdcall';
procedure CancelExtract; external 'CancelExtract@files:is7z.dll stdcall';

procedure Button1OnClick(Sender: TObject);
begin
CancelExtract;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep=ssPostInstall then
   begin
    Button1:=TButton.create(WizardForm);
    Button1.parent:=WizardForm;
    Button1.width:= WizardForm.cancelbutton.width;
    Button1.Height:= WizardForm.cancelbutton.Height;
    Button1.caption:='取消解压';
    Button1.left:= 290;
    Button1.top:=WizardForm.cancelbutton.top;
    Button1.OnClick:=@Button1OnClick;
    WizardForm.StatusLabel.Caption:= '正在解压外部 7zip 文件,请稍候...';
    try
     Extract7z (wizardform.handle, WizardForm.ProgressGauge.handle, WizardForm.FileNameLabel.handle, ExpandConstant('{src}') + '\1.7z', ExpandConstant('{app}'), 'mypass');    // 外部文件 1.7z,最后这个参数是它的解压密码
     Button1.visible:=false;
    except
     MsgBox('密码错误!', mbInformation, MB_OK);
     Button1.visible:=false;
    end;
   end;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2013-03-31
这里的代码更新了:
http://bbs.hanzify.org/read-htm-tid-49699.html
在 14 楼。
离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 7 发表于: 2013-04-01
感谢虎爷!

但我在编译程式码时还是发生错误了
可否再帮我看一下
Inno为 restool 版的 Inno Setup-5.5.2EX-unicode

第一段码在line22处发生错误


第二段码(不添加第二个进度条,而是直接在原来第一个进度条中显示解压外部文件进度的代码:)
在line24处发生错误

离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 8 发表于: 2013-04-01
说明出错所在的代码中的空格并不是真正的空格,你只要把每行前面的“空格”都删除就行了。
原因可能是我帖子中使用的代码引用把代码中的空格字符转码了。
我把 4 楼和 5 楼中的代码引用去掉了,你重新复制代码试试看。
离线sidelee72

发帖
29
金钱
290
威望
29
只看该作者 9 发表于: 2013-04-01
代码可以编译了,但还是一样得到 "Invalid password!"
两段代码皆然,真是弄得我头好痛...
我把编译好的文本及1.7z 发上来,1.7z密码是mypass
7z.rar (278 K) 下载次数:10
麻煩虎爷在帮我诊断一下.......................