powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NSIS или Inno Setup?
25 сообщений из 159, страница 6 из 7
NSIS или Inno Setup?
    #38306937
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД...

Теперь надо весь этот хлам откомпилять.

Качаем, ставим Visual C++ 2005 Express Edition.

В конце инсталляции (под Win 7 x64 Pro) появляется окошко о "неправильной" инсталляци... лезем в инет за спавкой...угу, несовместимы.

Хотя некоторые товарищи утверждают, что если снять суровые правила доступа к папке инсталляции студии, все работает. Что и делаем. Тестовое С++ приложение строится без проблем.

Продолжаем.

Run->Cmd:

...идем в папку исходников trunk, компилируем меню для NSIS:

cd D:\bNSIS\trunk\Contrib\NSIS Menu\wx
wxbuild.bat
...

...фиквам: не найден файл windows.h. Точно, не найден. Нет его. Фига себе Visual C++.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38306939
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД...
...фиквам: не найден файл windows.h. Точно, не найден. Нет его. Фига себе Visual C++.
Ну да, все правильно: в MS VS экспресс эдишн не входит Platform SDK.

Что-то меня это достало. Попробую поставить пиратку триалку MS VS 2005 90-дневню, в которой все в одном флаконе.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38306958
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД...Попробую поставить пиратку триалку MS VS 2005 90-дневню, в которой все в одном флаконе.
Ой-ей... версия, которая trunk, и есть та самая глючная альфа. :(

Пожалуй, проще скачать исходники текущей 2.46 http://nsis.svn.sourceforge.net/viewvc/nsis/NSIS/tags/v246/?view=tar
- и подправить в них файл, генерирующий манифест инсталлятора.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38306959
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД...скачать исходники текущей 2.46 http://nsis.svn.sourceforge.net/viewvc/nsis/NSIS/tags/v246/?view=tar
- и подправить в них файл, генерирующий манифест инсталлятора.

Файл manifest.cpp, исправляем строчку №60, теперь она будет выглядеть так:

Код: plaintext
1.
        xml += "<compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"><application><supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\"/><supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\"/><supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\"/></application></compatibility>";



Т.е., добавлен GUID - идентификатор для Win 8:
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
...
Попью кофе. Не может быть, чтобы махровому дельфятнику какая-то фигня на сипипи не далась.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38306961
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Зараза. Scans слишком новой версии. Ставлю 1.2.0.
Зараза. Scans версии 1.2.0 без прав администратора не ставится. Даю права. Ставится.
Зараза. HTML Help Workshop в Win 7 недоступен. chm файлы не генерятся. Ставлю насильно: http://ru.originaldll.com/file/hhc.exe/19713.html
...
Зараза. Еще пришлось руками прописать в path пути к питоновским бинарникам и к его же папке Scripts.
...

Ура, типа. У меня теперь есть NSIS, генерирующий инсталляторы, совместимый с MS Win 98.. MS Win 8.

В очередь, сукины дети. Завтра потестирую.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307042
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,
вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS)
http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307054
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62чччД,
вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS)
http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/
Я чуть выше писал об этом.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307055
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДs62чччД,
вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS)
http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/
Я чуть выше писал об этом.
14468415
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307139
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62, Нам чччД рассказывает про подводные камни и лоцию рисует.
А ты, не читая, им опробованную хрень предлагаешь!
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307207
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gators62, Нам чччД рассказывает про подводные камни и лоцию рисует.
А ты, не читая, им опробованную хрень предлагаешь!Ошибаешься, как раз не опробованную:
чччДБлин. Оставлю этот вариант "на сладкое", если ничего не придумаю.
Ты сам-то всё прочитал? )
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307208
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, все-таки опробованную:
чччДПроверил: работает, но требует установленного дотнета соответствующей версии.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307212
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62, мне не надь. Но будь уверен. Со вчерашнего вечера.
И не увидел смысла расшифровки раскрытия ТУТ из 14468415 .

Чужие мысли воруешь?
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307215
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator,
я написал чччД и он отреагировал спокойно. А тебя что-то клинит.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307221
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62Gator,
я написал чччД и он отреагировал спокойно. А тебя что-то клинит. Дык я в отпуске, а у них он впереди. И продолжительность разная :)

Впрочем, может быть ты тот самый "дяденька" из тут?
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #38307223
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В отпуске это хорошо.)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NSIS или Inno Setup?
    #39319984
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу плагинов.

Тут ранее писали, что либо пользуемся встроенными средствами ("командами") NSIS, либо используем расширения - "плагины".

В основном время тратится именно на то, чтобы найти подходящий плагин, разобраться, как он работает и заточить под свои нужды.
Но часто написать нужный плагин гораздо проще, чем найти готовый (и разобраться с ним).

Обращаться к плагину следует так:

Имя_Dll:Имя_Метода [необязательные параметры]

Сейчас расскажу, как это делается.

Плагин - это dll, особым образом написанная. Вообщем, можно использовать не только самописные, но и "системные" - user32.dll, например. Но именно "плагины" использовать проще всего.

Плагин включается в тело дистрибутива при компиляции последнего, просто по факту обращения к плагину.
Компилятор NSIS ищет плагины в своей директории Plugins, дочерней по отношению к директории, откуда был запущенк компилятор NSIS.
Для того, чтобы указать дополнительную директорию поиска, нужно использовать команду времени компиляции !addplugindir:

!addplugindir ..\myplugin
MyPlugin::SomeFunction


Так как есть обращение к плагину MyPlugin, он будет включен в дистрибутив.
Обращение к плагину возможно только в рантайме, следовательно, код вызова
MyPlugin::SomeFunction
допустим только в секциях . Ну и во всяких там функциях, которые вызываются из секций.
...
В плагин можно передавать параметры. Кроме того, параметры можно занести в переменные NSIS ($0, $1, ...) и считать их в плагине.
Плагин, естественно, может установить значения переменных NSIS и таким образом вернуть результат. Доступны и так всеми "любимые" стековые операции.
В плагин можно передать функции NSIS. Я про те, которые:

Function func
;... бла-бла
FunctionEnd

Много чего можно.

Сейчас набросаю крошечный NSIS - проект с крошечным самописным плагином.
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319985
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NSIS-проект:

Test.nsi
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Name "Delphi plugin test"

OutFile "DelphiPluginTest.exe" 

ShowInstDetails show

; Будем использовать новомодный интерфейс  MUI2.nsh: 
!include MUI2.nsh

; Ага!
!addplugindir "."

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES


Section "Section One"
  MyPlugin::ShowLogText "Привет! Это секция 1!"
SectionEnd

Section "Section Two"
  MyPlugin::ShowDialog "Привет! Это секция 2!"
SectionEnd


Видим две секции, в первой - обращение к MyPlugin::ShowLogText, во второй - MyPlugin::ShowDialog.

ShowLogText и ShowDialog - это методы, реализованные в моем плагине.
Код проекта плагина:
MyPlugin.dpr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
library MyPlugin;
uses
  SysUtils,
  Classes,
  Plugin_Impl in 'Plugin_Impl.pas',
  nsis in 'nsis.pas';
{$R *.res}
exports ShowLogText, ShowDialog;
begin
end.


Вроде все понятно и просто.
nsis.pas - это просто паскалевская обертка к api плагинов NSIS.
nsis.pas
{
Original Code from
(C) 2001 - Peter Windridge

Code in separate unit and some changes
2003 by Bernhard Mayer

Fixed and formatted by Brett Dever
http://editor.nfscheats.com/

simply include this unit in your plugin project and export
functions as needed
}

unit nsis;

interface

uses
windows, CommCtrl, SysUtils;

type
VarConstants = (
INST_0, // $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;

type
PluginCallbackMessages = (
NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup
NSPIM_GUIUNLOAD // Called after .onGUIEnd
);
TNSPIM = NSPIM_UNLOAD..NSPIM_GUIUNLOAD;

//TPluginCallback = function (const NSPIM: Integer): Pointer; cdecl;

TExecuteCodeSegment = function (const funct_id: Integer; const parent: HWND): Integer; stdcall;
Tvalidate_filename = procedure (const filename: PChar); stdcall;
TRegisterPluginCallback = function (const DllInstance: HMODULE; const CallbackFunction: Pointer): Integer; stdcall;

pexec_flags_t = ^exec_flags_t;
exec_flags_t = record
autoclose: Integer;
all_user_var: Integer;
exec_error: Integer;
abort: Integer;
exec_reboot: Integer;
reboot_called: Integer;
XXX_cur_insttype: Integer;
plugin_api_version: Integer;
silent: Integer;
instdir_error: Integer;
rtl: Integer;
errlvl: Integer;
alter_reg_view: Integer;
status_update: Integer;
end;

pextrap_t = ^extrap_t;
extrap_t = record
exec_flags: Pointer; // exec_flags_t;
exec_code_segment: TExecuteCodeSegment; // TFarProc;
validate_filename: Pointer; // Tvalidate_filename;
RegisterPluginCallback: Pointer; //TRegisterPluginCallback;
end;

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;
g_hwndList: HWND;
g_hwndLogList: HWND;
g_extraparameters: pextrap_t;

procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer = nil);

function LogMessage(Msg : String): BOOL;
function Call(NSIS_func : String) : Integer;
function PopString(): string;
procedure PushString(const str: string='');
function GetUserVariable(const varnum: TVariableList): string;
procedure SetUserVariable(const varnum: TVariableList; const value: string);
procedure NSISDialog(const text, caption: string; const buttons: integer);

implementation

procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer = nil);
begin
g_stringsize := string_size;
g_hwndParent := hwndParent;
g_stacktop := stacktop;
g_variables := variables;
g_hwndList := FindWindowEx(FindWindowEx(g_hwndParent, 0, '#32770', nil), 0,'SysListView32', nil);
g_extraparameters := extraparameters;
end;


function Call(NSIS_func : String) : Integer;
var
codeoffset: Integer; //The ID of nsis function
begin
Result := 0;
codeoffset := StrToIntDef(NSIS_func, 0);
if (codeoffset <> 0) and (g_extraparameters <> nil) then
begin
codeoffset := codeoffset - 1;
Result := g_extraparameters.exec_code_segment(codeoffset, g_hwndParent);
end;
end;

function LogMessage(Msg : String): BOOL;
var
ItemCount : Integer;
item: TLVItem;
begin
Result := FAlse;
if g_hwndList = 0 then exit;
FillChar( item, sizeof(item), 0 );
ItemCount := SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0);
item.iItem := ItemCount;
item.mask := LVIF_TEXT;
item.pszText := PChar(Msg);
ListView_InsertItem(g_hwndList, item);
ListView_EnsureVisible(g_hwndList, ItemCount, TRUE);
end;

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);
var
hwndOwner: HWND;
begin
hwndOwner := g_hwndParent;
if not IsWindow(g_hwndParent) then hwndOwner := 0; // g_hwndParent is not valid in NSPIM_[GUI]UNLOAD
MessageBox(hwndOwner, PChar(text), PChar(caption), buttons);
end;

begin

end.


Реализация методов ShowLogText и ShowDialog:
Plugin_Impl.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
unit Plugin_Impl;

interface
uses
  Windows;
procedure ShowLogText(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
procedure ShowDialog(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;

implementation

uses
  nsis;

procedure ShowLogText(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
var
  fStr: string;
begin
  Init(hwndParent, string_size, variables, stacktop);
  fStr := PopString();
  LogMessage(fStr)
end;

procedure ShowDialog(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
var
  fStr: string;
begin
  Init(hwndParent, string_size, variables, stacktop);
  fStr := PopString();
  NSISDialog(fStr, 'MyPlugin::ShowDialog', MB_OK)
end;
end.




Пояснения.

Методы плагинов имеют сигнатуру:

Код: pascal
1.
procedure Имя_метода(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;



Первым делом следует скопировать параметры в глобальные структуры библиотеки, вызвав метод
Код: pascal
1.
  Init(hwndParent, string_size, variables, stacktop);



Все, дальше можно работать.
~~~~~~~~~
Параметры плагину передаются в виде строки, через NSIS - стек.
Соответственно, для доступа к параметрам используется функция работы со стеком PopString():
Код: pascal
1.
2.
3.
4.
5.
var
  fStr: string;
begin
...
  fStr := PopString();



"Лишний" вызов PopString() не сломает систему, просто вернет пустую строку (и ошибку в коде завершения, если кому интересно).
...
Для компиляции инсталлятора нужно запустить makensisw.exe и затем с помощью makensisw.exe открыть наш скрипт test.nsi.
Перед этим нужно откомпилировать dll (сам плагин).

Исходники проекта (и результаты компиляции) прилагаются:
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319986
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Построено с использованием NSIS 3.0 (но вполне работает и на v2.42) x32 бита, Delphi 2007.
...
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319990
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для доступа к переменным NSIS в плагине используем GetUserVariable():

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var
  fOutDir : string;
  fExeDir : string;
  fInstDir : string;

  fR0 : string; // $0
  f_0 : string; // $R0

begin
...
  fOutDir := GetUserVariable(INST_OUTDIR); // Выходная директория для команды File
  fExeDir := GetUserVariable(INST_EXEDIR); // Директория, из которой запущен инсталлятор
  fInstDir := GetUserVariable(INST_INSTDIR); // Директория инсталляции
...
  fR0 := GetUserVariable(INST_0); // $0
  f_0 := GetUserVariable(INST_R0); // $R0



Для установки нового значения переменной NSIS используем SetUserVariable():

Код: pascal
1.
SetUserVariable(INST_INSTDIR, 'C:\InstallDir');
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319991
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для вызова NSIS функций из кода плагина сигнатура пользовательских методов должна быть чуть расширена:

Код: pascal
1.
2.
procedure Имя_Метода(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; 
  const extraparameters: pointer); cdecl;


То же самое касается метода Init:

Код: pascal
1.
  Init(hwndParent, string_size, variables, stacktop, extraparameters);



Благодаря тому, что методы NSIS - плагинов создаются с оглашением о связях типа cdecl , мы может использовать не все параметры, а только те, которые нужны: очисткой параметров занимается вызывающая сторона.

Передадим в плагин адрес NSIS функции через переменную NSIS $0 :

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Section "Fuction $0 section"

  MyPlugin::RegisterPluginCallback

  GetFunctionAddress $0 func
  MyPlugin::CallNSISFunc

SectionEnd

Function func
  DetailPrint "Привет из функции func!"
FunctionEnd



Вот сам метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure CallNSISFunc(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer); cdecl;
var
  fFuncAddr : String;
begin
  Init(hwndParent, string_size, variables, stacktop, extraparameters);

  fFuncAddr := GetUserVariable(INST_0);
  Call(fFuncAddr);
end;
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319993
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, можно назначить метод плагина, выполняющий специальные задачи: отслеживание выгрузки плагинов (по завершению приложения) и деинициализацию графической системы, после .onGUIEnd .
Для этого нужно зарегистрировать специальную функцию с сигнатурой

Код: pascal
1.
function имя_функции(const NSPIM: TNSPIM): Pointer; cdecl;



Тип параметров понятен из описания:
Код: pascal
1.
2.
3.
4.
5.
  PluginCallbackMessages = (
    NSPIM_UNLOAD,   // This is the last message a plugin gets, do final cleanup
    NSPIM_GUIUNLOAD // Called after .onGUIEnd
    );
  TNSPIM = NSPIM_UNLOAD..NSPIM_GUIUNLOAD;



В качестве наполнения такой функции будем показывать простые диалоги:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function MynSysCallBack(const NSPIM: TNSPIM): Pointer; cdecl;
begin
  Result := nil;
  if NSPIM = NSPIM_UNLOAD then
      NSISDialog(PChar('Выгрузка плагинов, последний коллбэк, гудбай!'), PChar('MynSysCallBack'), MB_OK)
  else  if NSPIM = NSPIM_GUIUNLOAD then
      NSISDialog(PChar('Деинициализация графики, ЧАО!'), PChar('MynSysCallBack'), MB_OK)
end;


... а вот так эта функция регистрируется (не забываем про extraparameters !):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure RegisterPluginCallback(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer); cdecl;
var
  ThisDllInstance : HMODULE;
begin
  Init(hwndParent, string_size, variables, stacktop, extraparameters);

  if g_extraparameters <> nil then
  begin
    ThisDllInstance := hInstance;
    TRegisterPluginCallback(g_extraparameters.RegisterPluginCallback)(ThisDllInstance, @MynSysCallBack);
  end;
end;
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39319994
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, вроде и все основные "премудрости".
Еще можно поговорить о доступе к элементам GUI, тут можно посмотреть на nsis.pas, где вполне понятно реализован вспомогательный метод LogMessage(), в котором выполняется обращение к списку лог-сообщений.

Имхо, методов NSISDialog и LogMessage достаточно для большинства случаев взаимодействия с пользователем, и, раз уж в дело подключена Delphi, можно строить диалоги произвольной сложности средствами самой Delphi.
...
Полный проект со всеми примерами:
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39356399
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот вопрос Как запустить процесс с правами AsUser из-под процесса с правами AsAdministrator? возник для запуска приложений из-под инсталлятора.

Было (высокие права "наследовались" от инсталлятора):

Код: javascript
1.
    Exec "$INSTDIR\BExpert.EXE"


Стало (приложение запускается с правами экплорера):
Код: javascript
1.
    Exec '"$WINDIR\explorer.exe"  "$INSTDIR\BExpert.EXE"'
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39356448
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Довольно странно, но в форме
Код: php
1.
ExecShell "$INSTDIR\BExpert.EXE"


- не работает. То есть, приложение запускается, но с высокими правами.

Т.обр., рабочая команда - вот такая:

Код: php
1.
    Exec '"$WINDIR\explorer.exe"  "$INSTDIR\BExpert.EXE"'
...
Рейтинг: 0 / 0
NSIS или Inno Setup?
    #39356452
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД, в InnoSetup для этого есть флаг runasoriginaluser и функция ExecAsOriginalUser.
...
Рейтинг: 0 / 0
25 сообщений из 159, страница 6 из 7
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NSIS или Inno Setup?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]