RSS
热门关键字:  计算机有关资料  33252  mkv  word  MKV_NT
当前位置 : 主页>vc编程>其它编程知识>列表

教你如何编程调用 NSIS 的插件

来源:http://restools.hanzify.org/ 作者:xin 时间:2006-12-01 点击:
看见 NSIS 有不少很好的插件,例如 BT 下载的专用插件,如果你不想用 NSIS 来编写 BT 种子下载的专用程序,但是又不会写 BT 下载的客户端,怎么办,当然是最好能够调用这些现成的插件啦,所以以下我示范一下如何调用这些插件,不过我举的例子是使用 NSIS 的闪屏插件(splash.dll),不过因为 NSIS 插件都是统一规格的,所以只是调用参数稍稍不同而已,大同小异。以下为调用程序的源代码。
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.
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册