Applied patch #838864 - String-friendly Delphi ExDLL

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3136 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-11-13 13:04:54 +00:00
parent d27d6dfb57
commit c775c5a3e8
3 changed files with 82 additions and 104 deletions

View file

@ -2,10 +2,10 @@
NSIS ExDLL example NSIS ExDLL example
(C) 2001 - Peter Windridge (C) 2001 - Peter Windridge
Fixed and formatted by Alexander Tereschenko Fixed and formatted by Brett Dever
http://futuris.plastiqueweb.com/ http://editor.nfscheats.com/
Tested in Delphi 6.01 Tested in Delphi 7.0
} }
library exdll; library exdll;
@ -54,75 +54,62 @@ var
g_variables: PChar; g_variables: PChar;
g_hwndParent: HWND; g_hwndParent: HWND;
function PopString(str: PChar):integer; function PopString(): string;
var var
th: pstack_t; th: pstack_t;
begin begin
if integer(g_stacktop^) = 0 then if integer(g_stacktop^) <> 0 then begin
begin th := g_stacktop^;
Result:=1; Result := PChar(@th.text);
Exit; g_stacktop^ := th.next;
end; GlobalFree(HGLOBAL(th));
th:=g_stacktop^; end;
lstrcpy(str,@th.text);
g_stacktop^ := th.next;
GlobalFree(HGLOBAL(th));
Result:=0;
end; end;
function PushString(str: PChar):integer; procedure PushString(const str: string='');
var var
th: pstack_t; th: pstack_t;
begin begin
if integer(g_stacktop) = 0 then if integer(g_stacktop) <> 0 then begin
begin th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
Result:=1; lstrcpyn(@th.text, PChar(str), g_stringsize);
Exit; th.next := g_stacktop^;
end; g_stacktop^ := th;
th:=pstack_t(GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize)); end;
lstrcpyn(@th.text,str,g_stringsize);
th.next:=g_stacktop^;
g_stacktop^:=th;
Result:=0;
end; end;
function GetUserVariable(varnum: TVariableList):PChar; function GetUserVariable(varnum: TVariableList): string;
begin begin
if (integer(varnum) < 0) or (integer(varnum) >= integer(__INST_LAST)) then if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
begin Result := g_variables + integer(varnum) * g_stringsize
Result:=''; else
Exit; Result := '';
end;
Result:=g_variables+integer(varnum)*g_stringsize;
end; end;
procedure SetUserVariable(varnum: TVariableList; value: PChar); procedure SetUserVariable(varnum: TVariableList; value: string);
begin begin
if (value <> nil) and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
begin lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
lstrcpy(g_variables+integer(varnum)*g_stringsize,value);
end;
end; end;
function ex_dll(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer):integer; cdecl; procedure NSISDialog(text, caption: string; buttons: integer);
var begin
c: PChar; MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
buf: array[0..1024] of char; end;
procedure ex_dll(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer); cdecl;
begin begin
// set up global variables // set up global variables
g_stringsize:=string_size; g_stringsize := string_size;
g_hwndParent:=hwndParent; g_hwndParent := hwndParent;
g_stringsize:=string_size; g_stringsize := string_size;
g_stacktop:=stacktop; g_stacktop := stacktop;
g_variables:=variables; g_variables := variables;
c:=GetUserVariable(INST_0); NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
MessageBox(g_hwndParent,c,'The value of $0',MB_OK); NSISDialog(PopString, 'pop', MB_OK);
PopString(@buf); PushString('Hello, this is a push');
MessageBox(g_hwndParent,@buf,'pop',MB_OK); SetUserVariable(INST_0, 'This is 0');
PushString(PChar('Hello, this is a push'));
Result:=1;
end; end;
exports ex_dll; exports ex_dll;

View file

@ -14,21 +14,15 @@ library exdll;
uses uses
nsis, windows; nsis, windows;
function ex_dll(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer):integer; cdecl; procedure ex_dll(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer); cdecl;
var
c: PChar;
buf: array[0..1024] of char;
begin begin
// set up global variables // set up global variables
Init(hwndParent,string_size,variables,stacktop); Init(hwndParent, string_size, variables, stacktop);
c:=GetUserVariable(INST_0); NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
MessageBox(g_hwndParent,c,'The value of $0',MB_OK); NSISDialog(PopString, 'pop', MB_OK);
PopString(@buf); PushString('Hello, this is a push');
MessageBox(g_hwndParent,@buf,'pop',MB_OK); SetUserVariable(INST_0, 'This is 0');
PushString(PChar('Hello, this is a push'));
Result:=1;
end; end;
exports ex_dll; exports ex_dll;

View file

@ -5,7 +5,10 @@
Code in seperate unit and some changes Code in seperate unit and some changes
2003 by Bernhard Mayer 2003 by Bernhard Mayer
simple include this unit in your plugin project and export Fixed and formatted by Brett Dever
http://editor.nfscheats.com/
simply include this unit in your plugin project and export
functions as needed functions as needed
} }
@ -60,10 +63,11 @@ var
g_hwndParent: HWND; g_hwndParent: HWND;
procedure Init(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer); procedure Init(hwndParent: HWND; string_size: integer; variables: PChar; stacktop: pointer);
function PopString(str: PChar):integer; function PopString(): string;
function PushString(str: PChar):integer; procedure PushString(const str: string='');
function GetUserVariable(varnum: TVariableList):PChar; function GetUserVariable(varnum: TVariableList): string;
function SetUserVariable(varnum: TVariableList; value: PChar):integer; procedure SetUserVariable(varnum: TVariableList; value: string);
procedure NSISDialog(text, caption: string; buttons: integer);
implementation implementation
@ -75,54 +79,47 @@ begin
g_variables:=variables; g_variables:=variables;
end; end;
function PopString(str: PChar):integer; function PopString(): string;
var var
th: pstack_t; th: pstack_t;
begin begin
if integer(g_stacktop^) = 0 then if integer(g_stacktop^) <> 0 then begin
begin th := g_stacktop^;
Result:=1; Result := PChar(@th.text);
Exit; g_stacktop^ := th.next;
end; GlobalFree(HGLOBAL(th));
th:=g_stacktop^; end;
lstrcpy(str,@th.text);
g_stacktop^ := th.next;
GlobalFree(HGLOBAL(th));
Result:=0;
end; end;
function PushString(str: PChar):integer; procedure PushString(const str: string='');
var var
th: pstack_t; th: pstack_t;
begin begin
if integer(g_stacktop) = 0 then if integer(g_stacktop) <> 0 then begin
begin th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
Result:=1; lstrcpyn(@th.text, PChar(str), g_stringsize);
Exit; th.next := g_stacktop^;
end; g_stacktop^ := th;
th:=pstack_t(GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize)); end;
lstrcpyn(@th.text,str,g_stringsize);
th.next:=g_stacktop^;
g_stacktop^:=th;
Result:=0;
end; end;
function GetUserVariable(varnum: TVariableList):PChar; function GetUserVariable(varnum: TVariableList): string;
begin begin
if (integer(varnum) < 0) or (integer(varnum) >= integer(__INST_LAST)) then if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
begin Result := g_variables + integer(varnum) * g_stringsize
Result:=''; else
Exit; Result := '';
end;
Result:=g_variables+integer(varnum)*g_stringsize;
end; end;
procedure SetUserVariable(varnum: TVariableList; value: PChar); procedure SetUserVariable(varnum: TVariableList; value: string);
begin begin
if (value <> nil) and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
begin lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
lstrcpy(g_variables+integer(varnum)*g_stringsize,value); end;
end;
procedure NSISDialog(text, caption: string; buttons: integer);
begin
MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
end; end;
begin begin