Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: Sanch8
Дата сообщения: 26.04.2015 10:37
Вопрос такой, есть ли в NSIS возможность на custom странице создать закладки?
Автор: Victor_VG
Дата сообщения: 26.04.2015 11:32
Sanch8

Не понял что вы имеете ввиду? Может вашу идею можно проще реализовать?
Автор: Sanch8
Дата сообщения: 26.04.2015 12:02
Victor_VG

Пример на картинке
Автор: Victor_VG
Дата сообщения: 26.04.2015 12:37
Sanch8

Вкладка не равна Закладка - смысл понятий разный, тот кто рисовал пример ошибся, бывает. Нет, этого вы в NSIS не сделаете - для этого нужно весь компилер под MDI переписывать, а он исходно сделан в SDI.
Автор: Sanch8
Дата сообщения: 26.04.2015 12:49
Victor_VG
Понял, думал плагин может какой поможет Пока такого вроде нет.
Автор: Victor_VG
Дата сообщения: 26.04.2015 12:53
Sanch8

Плагин в данном случае бесполезен т.к. поддержки MDI нет на уровне makensisw и стубов.
Автор: MKN
Дата сообщения: 28.04.2015 16:25
Sanch8

Цитата:
Пример на картинке

Можно сделать нечто похожее... На первой кастомной странице, например, 3 кнопки, каждая из которых открывает новую кастомную страницу на той же позиции. Общее - на всех страницах одинаково, потому создастся эффект переключения как бы закладок на одной странице...
Можно переключать не страницы , а собственные окна (CreateWindowEx) в окне одной основной страницы...
Автор: SvetonosnyAngel
Дата сообщения: 29.04.2015 17:45

Цитата:
Также надо "совершить" takeown.exe и icacls.exe над этими файлами и папками

nsExec::Exec 'takeown.exe /F $WINDIR\notepad.exe'
Pop $0
nsExec::Exec 'takeown.exe /F $SYSDIR\notepad.exe'
Pop $0

nsExec::Exec 'icacls.exe $WINDIR\notepad.exe /grant "$USERNAME":F'
Pop $0
nsExec::Exec 'icacls.exe $SYSDIR\notepad.exe /grant "$USERNAME":F'
Pop $0
Автор: dialmak
Дата сообщения: 03.06.2015 00:27
ALL Есть ли вариант запустить внешний файл в ТОМ ЖЕ окне CMD из NSIS?
Автор: Victor_VG
Дата сообщения: 03.06.2015 00:57
dialmak

Exec::, ExecDOS::, ExecWait::, NsExec:: . НО! NSIS это GUI программа, потому в любом случае консольная программа запустится в отдельной задаче, а запустить можно что угодно, только прописав правильный путь к бинарнику. Сам для этого NsExec использовал.
Автор: dialmak
Дата сообщения: 03.06.2015 01:09
Victor_VG

Цитата:
потому в любом случае консольная программа запустится в отдельной задаче

Имелось ввиду в отдельном окне видимо.
Не уверен. Можно обойти видимо через System::Call. Но я баран...

ExecDOS:: , NsExec:: не годятся - они скрывают окно.
Exec::, , ExecWait:: не годятся - они создают новое окно.

Добавлено:

Цитата:
NSIS это GUI программа

Дык GUI можно скрыть, это не проблема.

Добавлено:
Не хочется Autoit-ом делать - там размр. Может акие-то ещё варианты есть. Нужно упаковать пару файлов и запустить в том же консольном окне. 7sfx - тоже отпал по той же причине, что и NSIS. Хотя пока роюсь..
Автор: Victor_VG
Дата сообщения: 03.06.2015 01:16
dialmak

Именно в задаче т.к. GUI и консоль это независимые подсистемы ОС и потому обойти это невозможно. Сессия пользователя будет та же (если не применять приёмы типа Run As...), задачи разные. Если же стоит вопрос что имеется существующая сессия CMD и в ней надо что-то запустить, то это через API и получение её PID. Тут я с ходу решения не подскажу.
Автор: dialmak
Дата сообщения: 03.06.2015 01:24

Цитата:
имеется существующая сессия CMD и в ней надо что-то запустить, то это через API

Да. Это нужный вариант. Как прогуглить? Чего вбивать нужно?
Автор: Victor_VG
Дата сообщения: 03.06.2015 01:29
dialmak

Тут сначала придётся в MSDN копаться чтобы найти нужные вызовы WinAPI.
Автор: dialmak
Дата сообщения: 03.06.2015 01:34
Victor_VG
Да там зарыться можно. Видимо придётся autoit-ом сделать...
Автор: Victor_VG
Дата сообщения: 03.06.2015 01:38
dialmak

Там да, но это надёжный вариант т.к. если известен PID процесса можно сделать и всё остальное, в том числе и отдать ему команду, а так ОС просто запустит новую копию командного интерпретатора которая естественно выведет собственное окно.
Автор: dialmak
Дата сообщения: 03.06.2015 01:40

Цитата:
если известен PID процесса можно сделать и всё остальное, в том числе и отдать ему команду

Да там ничего не нужно ловить. Скомпилил как консольное приложение и усе.
Автор: Victor_VG
Дата сообщения: 03.06.2015 02:31
dialmak

Цитата:
Да там ничего не нужно ловить.

Ага, а все процессы в системе один единственный PID используют. Неверно, и потому нужно найти/знать желаемый.
Автор: boi1eI
Дата сообщения: 03.06.2015 02:47
dialmak
Батником извне управлять, и зачем это извращенство. Может проще изнутри?
Автор: 820815
Дата сообщения: 03.06.2015 04:02

Цитата:
Видимо придётся autoit-ом сделать

Зачем тогда мучиться с NSIS? Ради экономии нескольких сотен KB?


Цитата:
Нужно упаковать пару файлов и запустить в том же консольном окне

А до этого то что в этом окне происходит?
Автор: Victor_VG
Дата сообщения: 03.06.2015 11:04
820815

Цитата:
Нужно упаковать пару файлов и запустить в том же консольном окне

Эта задача откуда? Я не отыскал её на последних страницах. Но, по идее решается так -
через WinAPI получаем хендл нужного окна, по нему отыскиваем PID породившего его процесса и ему передаём команды, наблюдаем результат. Тут да, NSIS вообще не нужен т.к. задача решается стандартными языками программирования, к примеру ассемблером, C/C++/C#, Lua, PL/1, но не средствами инсталляторов.
Автор: dialmak
Дата сообщения: 03.06.2015 13:17
820815

Цитата:
Ради экономии нескольких сотен KB?

Да.

Цитата:
А до этого то что в этом окне происходит?

Ничего. Открытое окно CMD.
Victor_VG

Цитата:
Эта задача откуда?

Это я писал выше..

Цитата:
задача решается стандартными языками программирования, к примеру ассемблером, C/C++/C#, Lua, PL/1, но не средствами инсталляторов.

В главном exe должны лежать несколько консольных exe и спецскриптов. При вызове главного exe с параметрами - происходит запуск консольных различных exe с другими параметрами.
Подобную задачу обычно решал с помощью nsis или 7sfx, но в данном случае это не катит, так как консольное exe должно показать результат в стандартный поток вывода и главный exe звершает работу и его можно вызвать с другими параметрами. А читать и перенаправлять вывод нежелательно.
Может сумбурно написал, но я не программер. Для уменьшения размера сейчас пытаюсь использовать PureBasic. Осталось понять как всунуть другие exe в его exe-шник... Теоретически это возможно видимо.

Добавлено:
В PureBasic всё оказалось просто. Проблема решена.
Автор: Victor_VG
Дата сообщения: 03.06.2015 14:36
dialmak

Да, тут стоит подумать. С наскоку идей нет.
Автор: dialmak
Дата сообщения: 03.06.2015 15:05
Victor_VG

Цитата:
С наскоку идей нет

Можно использовать любой язык. Я использовал pureBaic. Exe-шники всунул в ресурсы(код ниже) и скомпилил как консольное приложение.

Код: DataSection
DN:
IncludeBinary "my.exe"
End_DN:
EndDataSection

CreateFile(0, "MY.EXE")
WriteData(0, ?DN, ?End_DN - ?DN)
CloseFile(0)
Автор: Victor_VG
Дата сообщения: 03.06.2015 17:07
Дык вопрос не в языке программирования, а в том как именно должен работать алгоритм для решения данной задачи с минимальными затратами.
Автор: dialmak
Дата сообщения: 03.06.2015 17:29
Victor_VG

Цитата:
Дык вопрос не в языке программирования, а в том как именно должен работать алгоритм для решения данной задачи с минимальными затратами.

Ну так и я об этом же. Незнаком с C/C++, поэтому выбрал PureBasic.

Цитата:
Можно использовать любой язык.

Полезное, что вынес из ситуации - на NSIS подобную задачу решить тяжело.
Автор: Victor_VG
Дата сообщения: 03.06.2015 17:57
dialmak

В данном случае я лично простого решения не вижу, а сложное чревато скрытыми проблемами коих разумнее избежать в зародыше.
Автор: megane68
Дата сообщения: 13.07.2015 19:55
Всех приветствую!
Решил сделать в установщике закрытие программы при обновлении. Если программа запущена, она должна закрыться, после чего происходит обновление.
Использую:
ExecWait "$INSTDIR\tv.exe -close"
но программа выдаёт ошибку на процесс одной библиотеки DLL. Видимо он не успевает завершиться до обновления.

Как установить таймер после закрытия tv.exe, а лучше дождаться завершения процесса DLL?
Автор: Victor_VG
Дата сообщения: 13.07.2015 20:27
megane68

А зачем так сложно!? ProcLib.nsh в ./Include, ставите плагин NsProcess и пользуйтесь из неё любым макросом ${TermProc} _PROCNAME _TXTFILE или ${TrmPrcc} _ProcName которые всё сделают и системную диагностику вдобавок расшифруют.

Автор: megane68
Дата сообщения: 14.07.2015 12:08
Victor_VG
Да, я читал в хелпе про этот плагин.
Дело в том, что программа портативная и не хотелось бы убивать процесс этой DLL-ки, потому как он должен выключаться именно при закрытии программы tv.exe.
В данном случае, если три раза прописать ExecWait '"$INSTDIR\tv.exe" -close', то процесс успевает кильнуться, поэтому хотелось бы именно назначить время ожидания после закрытия tv.exe.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.