| unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; VarConstants = ( INST_0, INST_1, // $1 INST_2, // $2 INST_3, // $3 INST_4, // $4 INST_5, // $5 INST_6, // $6 INST_7, // $7 INST_8, // $8 INST_9, // $9 INST_R0, // $R0 INST_R1, // $R1 INST_R2, // $R2 INST_R3, // $R3 INST_R4, // $R4 INST_R5, // $R5 INST_R6, // $R6 INST_R7, // $R7 INST_R8, // $R8 INST_R9, // $R9 INST_CMDLINE, // $CMDLINE INST_INSTDIR, // $INSTDIR INST_OUTDIR, // $OUTDIR INST_EXEDIR, // $EXEDIR INST_LANG, // $LANGUAGE __INST_LAST ); TVariableList = INST_0..__INST_LAST; pstack_t = ^stack_t; stack_t = record next: pstack_t; text: PChar; end; var g_stringsize: integer; g_stacktop: ^pstack_t; g_variables: PChar; g_hwndParent: HWND; ShowSplash: procedure (const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl; Form1: TForm1; implementation {$R *.DFM} function PopString(): string; var th: pstack_t; begin if integer(g_stacktop^) <> 0 then begin th := g_stacktop^; Result := PChar(@th.text); g_stacktop^ := th.next; GlobalFree(HGLOBAL(th)); end; end; procedure PushString(const str: string=''); var th: pstack_t; begin if integer(g_stacktop) <> 0 then begin th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize)); lstrcpyn(@th.text, PChar(str), g_stringsize); th.next := g_stacktop^; g_stacktop^ := th; end else begin g_stacktop:=Pointer(GlobalAlloc(GPTR, SizeOf(g_stacktop))); th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize)); lstrcpyn(@th.text, PChar(str), g_stringsize); th.next := nil; g_stacktop^ := th; end; end; function GetUserVariable(const varnum: TVariableList): string; begin if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then Result := g_variables + integer(varnum) * g_stringsize else Result := ''; end; procedure SetUserVariable(const varnum: TVariableList; const value: string); begin if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value)) end; procedure TForm1.Button1Click(Sender: TObject); var th: pstack_t; DllHandle: THandle; begin g_hwndParent:=handle; g_stringsize:=MAX_PATH; g_variables:=PChar(GlobalAlloc(GPTR, (integer(__INST_LAST)-integer(INST_0))*g_stringsize)); PushString('e:\logo'); //图片 logo.bmp 放到 e 盘根目录,调用时不要带扩展名,这是 splash.dll 的调用规则,所以调用之前,先看看这个插件的参数说明,免得调用失败没效果 PushString('1000'); DllHandle := LoadLibrary('splash.dll'); if DllHandle > 0 then begin ShowSplash := GetProcAddress(DllHandle, 'show'); if Assigned(ShowSplash) then ShowSplash(g_hwndParent,g_stringsize,g_variables,g_stacktop); FreeLibrary(DllHandle); end; GlobalFree(HGLOBAL(g_variables)); while g_stacktop^ <> nil do begin th := g_stacktop^; g_stacktop^ := th.next; GlobalFree(HGLOBAL(th)); end; g_stacktop:=nil; end; end. |
教你如何编程调用 NSIS 的插件
来源:http://restools.hanzify.org/
作者:xin
时间:2006-12-01
点击:
看见 NSIS 有不少很好的插件,例如 BT 下载的专用插件,如果你不想用 NSIS 来编写 BT 种子下载的专用程序,但是又不会写 BT 下载的客户端,怎么办,当然是最好能够调用这些现成的插件啦,所以以下我示范一下如何调用这些插件,不过我举的例子是使用 NSIS 的闪屏插件(splash.dll),不过因为 NSIS 插件都是统一规格的,所以只是调用参数稍稍不同而已,大同小异。以下为调用程序的源代码。
0
最新评论共有 0 位网友发表了评论
查看所有评论
发表评论
热点关注

