Inno Setup 回调函数插件


这是一篇关于 Inno Setup 回调函数使用的教学。
引用来自  test.iss,2008-6-3 20:06:17 引用来自 test.iss,2008-6-3 20:06:17
; -- test.iss --
; restools
; http://restools.hanzify.org
; 时间仓促,所以可能会有点谬误,如有错误可以提出
; waterctrl.dll 为一个用于 Inno Setup 的 16.5 KB 的水纹特效插件。
; 需要注意,插件使用 MFC, 系统需要有 mfc42.dll,不过一般系统自带。
; v2 版本  新增设置水纹插件的父句柄

;附加教学: Inno Setup 回调函数使用方法。
;这曾经是 Inno Setup 的弱点,相较于 NSIS 来说, Inno Setup 不能使用回调函数等于失去了许多 WINAPI 函数调用的机会。
;需要插件: InnoCallback.dll, 大小: 63.5KB 原插件地址: www.sherlocksoftware.org 已打包在本教学脚本中

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

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
Source: "waterctrl.dll"; Flags: dontcopy
Source: "WizModernImage-Is.bmp"; Flags: dontcopy
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

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

[code]
type
  
TTimerProc = procedure(h:longword; msg:longword; idevent:longword; dwTime:longword);
  // 回调函数参数格式声明
  
function WrapTimerProc(callback:TTimerProc; paramcount:integer):longword;
     external 'wrapcallback@files:innocallback.dll stdcall';
// 使用回调函数的主要入口转换函数.

function SetTimer(hWnd: longword; nIDEvent, uElapse: longword; lpTimerFunc: longword): longword;
     external 'SetTimer@user32.dll stdcall';
// WinAPI 函数, 时间循环函数, 这个函数需要回调函数, 否则不能实现功能

function enablewater(ParentWnd: HWND; Left, Top: integer; Bmp: HBITMAP;
     WaterRadius, WaterHeight: integer): BOOL; external 'enablewater@files:waterctrl.dll stdcall';
//ParentWnd     放置特效窗口的父窗口句柄。
//Left          左位置
//Top           上位置
//Bmp           位图句柄。
//WaterRadius   水纹半径,会令到水纹看起来范围更广。
//WaterHeight   水纹高度,会令到水纹看起来更深。
//注意,水纹插件自动根据图片来设定高度和宽度,
//另外水纹底图必须是翻转的图片,显示的时候会翻转图片来显示。

function waterblob(x, y: integer; radius, height: integer): BOOL; external 'waterblob@files:waterctrl.dll stdcall';
// 在 x,y 点产生半径为radius, 高度为height 的水纹。

function flattenwater(): BOOL; external 'flattenwater@files:waterctrl.dll stdcall';
// 平伏所有水纹。

function disablewater(): BOOL; external 'disablewater@files:waterctrl.dll stdcall';
//释放水纹插件

function setwaterparent(ParentWnd: HWND): BOOL; external 'setwaterparent@files:waterctrl.dll stdcall';
//v2 新增,设置水纹插件的父句柄

var
  
bmp: TBitmap;

procedure mytimerproc(h:longword; msg:longword; idevent:longword; dwTime:longword);
begin
  
waterblob(random(162), random(289), random(5), random(200));  // 随机产生小水纹
end;

procedure InitializeWizard();
var
  
timercallback: longword;
begin
  
ExtractTemporaryFile('WizModernImage-Is.bmp');
  bmp := TBitmap.create;
  bmp.LoadFromFile(ExpandConstant('{tmp}\WizModernImage-Is.bmp'));
  enablewater(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 3, 50);
  
  timercallback := WrapTimerProc(@mytimerproc,4); // 转换 Inno Setup 的函数入口
  
settimer(0, 0, 200, timercallback);  // 实现 Timer 的循环重复调用函数效果
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if
CurPageID = wpWelcome then
  begin
    
setwaterparent(WizardForm.WelcomePage.Handle);
//    waterblob(70, 198, 10, 1000);
  
end else
  if
CurPageID = wpFinished then
  begin
    
setwaterparent(WizardForm.FinishedPage.Handle);
//    waterblob(70, 198, 10, 1000);
  
end else
    
flattenwater();
end;

procedure DeinitializeSetup();
begin
  
disablewater();
  bmp.Free;
end;

点击下面连接下载例子。
http://restools.hanzify.org/inno/callback/inno_callback.zip



评论: 3 | 引用: 0 | 查看次数: 11173
  • 1
xin [2009-05-04 08:11 PM]
checkwin2k3 是你自定义的函数吧,如果你不知道,那么这个脚本估计不是你自己做的,找原作的人告诉你这个函数的内容。
DDAY [2009-05-03 09:13 PM]
你好
我编译一个应用程序的时候提示我
Required function or procedure 'checkwin2k3' not found
好像是说这个函数没有找到,请问一下高手这个怎么处理,因为我的安装程序要检测系统版本,还有是否安装过~~请高手解答一下
例如
Source: "c_\mysql\share\charsets\armscii8.xml"; DestDir: "c:\mysql\share\charsets"; Check: "CheckMysql()"; Flags: ignoreversion
dejoy [2008-06-03 09:28 PM]
好东东,顶一顶更健康
才刚想建议你做一个自动生成水纹的东东,没想到你先这么快就做出来了.
  • 1
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭