exdll.dpr 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. {
  2. NSIS ExDLL example
  3. (C) 2001 - Peter Windridge
  4. Fixed and formatted by Brett Dever
  5. http://editor.nfscheats.com/
  6. Tested in Delphi 7.0
  7. }
  8. library exdll;
  9. uses Windows;
  10. type
  11. VarConstants = (
  12. INST_0,
  13. INST_1, // $1
  14. INST_2, // $2
  15. INST_3, // $3
  16. INST_4, // $4
  17. INST_5, // $5
  18. INST_6, // $6
  19. INST_7, // $7
  20. INST_8, // $8
  21. INST_9, // $9
  22. INST_R0, // $R0
  23. INST_R1, // $R1
  24. INST_R2, // $R2
  25. INST_R3, // $R3
  26. INST_R4, // $R4
  27. INST_R5, // $R5
  28. INST_R6, // $R6
  29. INST_R7, // $R7
  30. INST_R8, // $R8
  31. INST_R9, // $R9
  32. INST_CMDLINE, // $CMDLINE
  33. INST_INSTDIR, // $INSTDIR
  34. INST_OUTDIR, // $OUTDIR
  35. INST_EXEDIR, // $EXEDIR
  36. INST_LANG, // $LANGUAGE
  37. __INST_LAST
  38. );
  39. TVariableList = INST_0..__INST_LAST;
  40. pstack_t = ^stack_t;
  41. stack_t = record
  42. next: pstack_t;
  43. text: PChar;
  44. end;
  45. var
  46. g_stringsize: integer;
  47. g_stacktop: ^pstack_t;
  48. g_variables: PChar;
  49. g_hwndParent: HWND;
  50. function PopString(): string;
  51. var
  52. th: pstack_t;
  53. begin
  54. if integer(g_stacktop^) <> 0 then begin
  55. th := g_stacktop^;
  56. Result := PChar(@th.text);
  57. g_stacktop^ := th.next;
  58. GlobalFree(HGLOBAL(th));
  59. end;
  60. end;
  61. procedure PushString(const str: string='');
  62. var
  63. th: pstack_t;
  64. begin
  65. if integer(g_stacktop) <> 0 then begin
  66. th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
  67. lstrcpyn(@th.text, PChar(str), g_stringsize);
  68. th.next := g_stacktop^;
  69. g_stacktop^ := th;
  70. end;
  71. end;
  72. function GetUserVariable(const varnum: TVariableList): string;
  73. begin
  74. if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
  75. Result := g_variables + integer(varnum) * g_stringsize
  76. else
  77. Result := '';
  78. end;
  79. procedure SetUserVariable(const varnum: TVariableList; const value: string);
  80. begin
  81. if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
  82. lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
  83. end;
  84. procedure NSISDialog(const text, caption: string; const buttons: integer);
  85. begin
  86. MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
  87. end;
  88. procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
  89. begin
  90. // setup global variables
  91. g_stringsize := string_size;
  92. g_hwndParent := hwndParent;
  93. g_stacktop := stacktop;
  94. g_variables := variables;
  95. // end global variable setup
  96. NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
  97. NSISDialog(PopString, 'pop', MB_OK);
  98. PushString('Hello, this is a push');
  99. SetUserVariable(INST_0, 'This is user var $0');
  100. end;
  101. exports ex_dll;
  102. begin
  103. end.