|
|
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччД... Теперь надо весь этот хлам откомпилять. Качаем, ставим 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++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 01:00 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччД... ...фиквам: не найден файл windows.h. Точно, не найден. Нет его. Фига себе Visual C++. Ну да, все правильно: в MS VS экспресс эдишн не входит Platform SDK. Что-то меня это достало. Попробую поставить пиратку триалку MS VS 2005 90-дневню, в которой все в одном флаконе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 01:04 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччД...Попробую поставить пиратку триалку MS VS 2005 90-дневню, в которой все в одном флаконе. Ой-ей... версия, которая trunk, и есть та самая глючная альфа. :( Пожалуй, проще скачать исходники текущей 2.46 http://nsis.svn.sourceforge.net/viewvc/nsis/NSIS/tags/v246/?view=tar - и подправить в них файл, генерирующий манифест инсталлятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 03:03 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччД...скачать исходники текущей 2.46 http://nsis.svn.sourceforge.net/viewvc/nsis/NSIS/tags/v246/?view=tar - и подправить в них файл, генерирующий манифест инсталлятора. Файл manifest.cpp, исправляем строчку №60, теперь она будет выглядеть так: Код: plaintext 1. Т.е., добавлен GUID - идентификатор для Win 8: {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38} ... Попью кофе. Не может быть, чтобы махровому дельфятнику какая-то фигня на сипипи не далась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 03:20 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
... Зараза. 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. В очередь, сукины дети. Завтра потестирую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 03:27 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччД, вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS) http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 13:55 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
s62чччД, вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS) http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/ Я чуть выше писал об этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 14:53 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
чччДs62чччД, вот я нагуглил что-то, кажется этим способом нужно только mt.exe (и NSIS) http://www.level533.com/2012/12/add-windows-8-manifest-to-nsis-installer/ Я чуть выше писал об этом. 14468415 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 15:03 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
s62, Нам чччД рассказывает про подводные камни и лоцию рисует. А ты, не читая, им опробованную хрень предлагаешь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 19:56 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Gators62, Нам чччД рассказывает про подводные камни и лоцию рисует. А ты, не читая, им опробованную хрень предлагаешь!Ошибаешься, как раз не опробованную: чччДБлин. Оставлю этот вариант "на сладкое", если ничего не придумаю. Ты сам-то всё прочитал? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:12 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Хотя нет, все-таки опробованную: чччДПроверил: работает, но требует установленного дотнета соответствующей версии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:15 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
s62, мне не надь. Но будь уверен. Со вчерашнего вечера. И не увидел смысла расшифровки раскрытия ТУТ из 14468415 . Чужие мысли воруешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:20 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Gator, я написал чччД и он отреагировал спокойно. А тебя что-то клинит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:23 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
s62Gator, я написал чччД и он отреагировал спокойно. А тебя что-то клинит. Дык я в отпуске, а у них он впереди. И продолжительность разная :) Впрочем, может быть ты тот самый "дяденька" из тут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:29 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
В отпуске это хорошо.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2013, 23:30 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
По поводу плагинов. Тут ранее писали, что либо пользуемся встроенными средствами ("командами") 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 - проект с крошечным самописным плагином. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 01:52 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
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. ShowLogText и ShowDialog - это методы, реализованные в моем плагине. Код проекта плагина: MyPlugin.dpr Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 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. Пояснения. Методы плагинов имеют сигнатуру: Код: pascal 1. Первым делом следует скопировать параметры в глобальные структуры библиотеки, вызвав метод Код: pascal 1. Все, дальше можно работать. ~~~~~~~~~ Параметры плагину передаются в виде строки, через NSIS - стек. Соответственно, для доступа к параметрам используется функция работы со стеком PopString(): Код: pascal 1. 2. 3. 4. 5. "Лишний" вызов PopString() не сломает систему, просто вернет пустую строку (и ошибку в коде завершения, если кому интересно). ... Для компиляции инсталлятора нужно запустить makensisw.exe и затем с помощью makensisw.exe открыть наш скрипт test.nsi. Перед этим нужно откомпилировать dll (сам плагин). Исходники проекта (и результаты компиляции) прилагаются: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 02:09 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Построено с использованием NSIS 3.0 (но вполне работает и на v2.42) x32 бита, Delphi 2007. ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 02:11 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Для доступа к переменным NSIS в плагине используем GetUserVariable(): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Для установки нового значения переменной NSIS используем SetUserVariable(): Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 03:44 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Для вызова NSIS функций из кода плагина сигнатура пользовательских методов должна быть чуть расширена: Код: pascal 1. 2. То же самое касается метода Init: Код: pascal 1. Благодаря тому, что методы NSIS - плагинов создаются с оглашением о связях типа cdecl , мы может использовать не все параметры, а только те, которые нужны: очисткой параметров занимается вызывающая сторона. Передадим в плагин адрес NSIS функции через переменную NSIS $0 : Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Вот сам метод Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 04:22 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Кроме того, можно назначить метод плагина, выполняющий специальные задачи: отслеживание выгрузки плагинов (по завершению приложения) и деинициализацию графической системы, после .onGUIEnd . Для этого нужно зарегистрировать специальную функцию с сигнатурой Код: pascal 1. Тип параметров понятен из описания: Код: pascal 1. 2. 3. 4. 5. В качестве наполнения такой функции будем показывать простые диалоги: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... а вот так эта функция регистрируется (не забываем про extraparameters !): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 04:33 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Вот, вроде и все основные "премудрости". Еще можно поговорить о доступе к элементам GUI, тут можно посмотреть на nsis.pas, где вполне понятно реализован вспомогательный метод LogMessage(), в котором выполняется обращение к списку лог-сообщений. Имхо, методов NSISDialog и LogMessage достаточно для большинства случаев взаимодействия с пользователем, и, раз уж в дело подключена Delphi, можно строить диалоги произвольной сложности средствами самой Delphi. ... Полный проект со всеми примерами: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 04:39 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Этот вопрос Как запустить процесс с правами AsUser из-под процесса с правами AsAdministrator? возник для запуска приложений из-под инсталлятора. Было (высокие права "наследовались" от инсталлятора): Код: javascript 1. Стало (приложение запускается с правами экплорера): Код: javascript 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 22:13 |
|
||
|
NSIS или Inno Setup?
|
|||
|---|---|---|---|
|
#18+
Довольно странно, но в форме Код: php 1. - не работает. То есть, приложение запускается, но с высокими правами. Т.обр., рабочая команда - вот такая: Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 00:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39319991&tid=2039409]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
403ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 766ms |

| 0 / 0 |
