119 lines
2.7 KiB
ObjectPascal
119 lines
2.7 KiB
ObjectPascal
|
{
|
||
|
NSIS ExDLL example
|
||
|
(C) 2001 - Peter Windridge
|
||
|
|
||
|
Fixed and formatted by Brett Dever
|
||
|
http://editor.nfscheats.com/
|
||
|
|
||
|
Tested in Delphi 7.0
|
||
|
}
|
||
|
|
||
|
library exdll;
|
||
|
|
||
|
uses Windows;
|
||
|
|
||
|
type
|
||
|
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;
|
||
|
|
||
|
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;
|
||
|
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 NSISDialog(const text, caption: string; const buttons: integer);
|
||
|
begin
|
||
|
MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
|
||
|
end;
|
||
|
|
||
|
procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
|
||
|
begin
|
||
|
// setup global variables
|
||
|
g_stringsize := string_size;
|
||
|
g_hwndParent := hwndParent;
|
||
|
g_stacktop := stacktop;
|
||
|
g_variables := variables;
|
||
|
// end global variable setup
|
||
|
|
||
|
NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
|
||
|
NSISDialog(PopString, 'pop', MB_OK);
|
||
|
PushString('Hello, this is a push');
|
||
|
SetUserVariable(INST_0, 'This is user var $0');
|
||
|
end;
|
||
|
|
||
|
exports ex_dll;
|
||
|
|
||
|
begin
|
||
|
end.
|