论坛风格切换切换到宽版
  • 19003阅读
  • 55回复

[原创]INNO & NSIS 双剑合璧 [复制链接]

上一主题 下一主题
离线restools
 

发帖
2848
金钱
1430
威望
143
只看楼主 倒序阅读 0 发表于: 2005-09-11
从此为 NSIS 开发的插件也通用于 INNO 了。

callnsis.dll 就是新作出来的调用 NSIS 插件地通用调用插件,适用于任何程序的正常调用,当然就会包括 INNO 了。

这个 callnsis.dll 的调用函数是 callplug 。Delphi 中声明如下。
procedure callplug(parentwnd: Integer; pluginname, funcname, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10: PChar); stdcall;
external 'callnsis.dll' name 'callplug';

预留 10 个参数,参数根据 NSIS 例子中来填入。10 个一般够用了,如果没用的就填空字符串。

看看以下的 INNO 例子。跟 NSIS 一样的效果。 :233

渐显渐隐的闪屏效果,还附带背景声音。

QUOTE
; -- Example1.iss --

; 演示如何调用 NSIS 插件的 INNO 安装程序。

[Setup]
AppName=我的程序
AppVerName=我的程序 版本 1.5
DefaultDirName={pf}\我的程序
DefaultGroupName=我的程序
UninstallDisplayIcon={app}\MyProg.exe

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.hlp"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
Source: "callnsis.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "AdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "logo.bmp"; DestDir: "{tmp}"; Flags: dontcopy
Source: "logo.wav"; DestDir: "{tmp}"; Flags: dontcopy


[Icons]
Name: "{group}\我的程序"; Filename: "{app}\MyProg.exe"

[code]
procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
external 'callplug@files:callnsis.dll stdcall';

procedure InitializeWizard();
begin
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\AdvSplash.dll')));
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\logo.bmp')));
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\logo.wav')));
  callplug(0,ExpandConstant('{tmp}\AdvSplash.dll'),'show','2800','1400','1200','-1',ExpandConstant('{tmp}\logo'),'','','','','');
end;


以下附件包括所有插件(包括通用调用插件 callnsis.dll 和 NSIS 专用插件 AdvSplash.dll)。
[attachmentid=16698]
附件: testapp.rar (67 K) 下载次数:75
我的BLOG:   http://restools.hanzify.org (Inno Setup 增强版, 插件 发布站点)
离线restools

发帖
2848
金钱
1430
威望
143
只看该作者 1 发表于: 2005-09-11
delphi 调用例子。
QUOTE
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure callplug(parentwnd: Integer; pluginname,funcname,
    param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar); stdcall;
external 'callnsis.dll' name 'callplug';

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  callplug(0,'AdvSplash.dll','show','2800','1400','1200','-1','logo','','','','','');
end;

end.


附带例子程序。
[attachmentid=16699]
附件: delphiapp.rar (65 K) 下载次数:43
我的BLOG:   http://restools.hanzify.org (Inno Setup 增强版, 插件 发布站点)
离线zhansh

发帖
1058
金钱
10
威望
1
只看该作者 2 发表于: 2005-09-11
感谢 restools 兄,崇拜 ing。。。可惜沙发没坐上
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 3 发表于: 2005-09-11
:233
不要在 PM 里问问题,PM 不是用来问问题的。
离线夜凉如水

发帖
176
金钱
70
威望
7
只看该作者 4 发表于: 2005-09-11
学习了!!!!!!测试去了!!!
离线restools

发帖
2848
金钱
1430
威望
143
只看该作者 5 发表于: 2005-09-11
稍稍修改了一下插件,加多了返回值,因为有时候需要返回结果。

QUOTE
; -- Example1.iss --

; 演示如何调用 NSIS 插件的 INNO 安装程序。
; 带有返回值的调用插件

[Setup]
AppName=我的程序
AppVerName=我的程序 版本 1.5
DefaultDirName={pf}\我的程序
DefaultGroupName=我的程序
UninstallDisplayIcon={app}\MyProg.exe

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.hlp"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
Source: "callnsis.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "AdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "logo.bmp"; DestDir: "{tmp}"; Flags: dontcopy
Source: "logo.wav"; DestDir: "{tmp}"; Flags: dontcopy


[Icons]
Name: "{group}\我的程序"; Filename: "{app}\MyProg.exe"

[code]
function callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar): Integer;
external 'callplug@files:callnsis.dll stdcall';

procedure InitializeWizard();
var
  val: Integer;
begin
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\AdvSplash.dll')));
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\logo.bmp')));
  ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\logo.wav')));
  val:=callplug(0,ExpandConstant('{tmp}\AdvSplash.dll'),'show','2800','1400','1200','-1',ExpandConstant('{tmp}\logo'),'','','','','');
 
  // 在 NSIS 的例子中调用是如下的:
 
  // SetOutPath $TEMP                              # 设置输出位置为临时目录
  // File /oname=logo.bmp "my_logo.bmp"            # 释放文件
  // File /oname=logo.wav "my_logo.wav"            # 释放文件
  // advsplash::show 2800 1400 1200 -1 $TEMP\logo  # 调用插件
  // Pop $0                                        # 取返回值: 返回 '1' 表示用户提前关闭闪屏, 返回 '0' 表示闪屏正常结束, 返回 '-1' 表示闪屏显示出错
 
  // 基本上,调用的方法都是一样的,所以只要稍稍看看 NSIS 的插件例子,你就可以在 INNO 中利用以上方法进行调用

  if val = 1 then
    MsgBox('你点击了闪屏窗口,导致闪屏提前关闭!', mbConfirmation, MB_OK);
end;


INNO 脚本附件:
[attachmentid=16700]
附件: testapp2.rar (68 K) 下载次数:41
我的BLOG:   http://restools.hanzify.org (Inno Setup 增强版, 插件 发布站点)
离线yangyicq
发帖
163
金钱
0
威望
0
只看该作者 6 发表于: 2005-09-11
谢谢,学习中,感觉非常不错!
离线刘波

发帖
2998
金钱
200
威望
20
只看该作者 7 发表于: 2005-09-11
强强联合!
离线羚羊谷
发帖
2
金钱
0
威望
0
只看该作者 8 发表于: 2005-09-11
学习了!!!!!!测试去了!!!
离线aguangkj
发帖
49
金钱
0
威望
0
只看该作者 9 发表于: 2005-09-11
学习了,谢谢restools
喜欢这里