Показать полную графическую версию : [архив].: NSIS - все вопросы :.
david141
12-04-2011, 19:36
Может, кто знает, что за ошибка?
Invalid command: ${LocateNoDetails}
Error in macro CopyFilesFromDir on macroline 34
Вот исходник (http://ifolder.ru/22925369) firefox-installer
Может, кто разберётся и выложит рабочий?
Народ привет!
А можно как нибудь получить версию файла на этапе компиляции?
Нужно для вписывания версии в имя инсталяшки.
Как я понял ${GetFileVersion} работает уже на этапе инсталяции...
kotkovets
13-04-2011, 20:42
А можно как нибудь получить версию файла на этапе компиляции? »
Не задавался таким вопросом, но получилось вот так...
1. Создаем батник ver.bat такого содержания:
for /f "tokens=1,2 delims= " %%i in ('filever.exe /v "путь\file.exe"^|find.exe /i "FileVersion"') do set %%i=%%j
echo !define PRODUCT_VERSION "%FileVersion%" > FileVersion.nsh
2. ver.bat ложим рядом со скриптом, путь\file.exe - прописываем путь к файлу только абсолютный или относительно скрипта
3. Берем утилитку filever.exe от мелкомягких (во вложении) и ложим рядом со скриптом.
4. Создаем скрипт такого содержания:
!system 'ver.bat' #запускаем батник
!include "FileVersion.nsh" # подключаем созданный хедер к основному скрипту
OutFile Setup_v${PRODUCT_VERSION}.exe
Section ""
SectionEnd
kotkovets, хитро. Спасибо. )
Но жаль что нет штатного средства. А так мне всё равно надо будет передавать кое-какие параметры через /D так что буду и версию передавать.
wolkow70
15-04-2011, 05:44
Товарищи, подскажите как включить в инсталлятор пустые папки?
Пробовал с помощью функции InstallFolderInternal, папки с файлами включаются в установщик, а пустые нет.
как включить в инсталлятор пустые папки? »
Лучше пустые папки создавать (с необходимыми путями и именами)
wolkow70
15-04-2011, 09:51
Лучше пустые папки создавать (с необходимыми путями и именами) »
Да, можно и создать, но мы не ищем легких путей...
Fireman68
15-04-2011, 12:17
Нужна помощь. После установки программы в тихой установке с ключом /S, установленная программа сразу же запускается, что надо прописать чтоб запуска программы не было или сможет как нибудь убить этот процесс
kotkovets
15-04-2011, 12:42
Для сборщиков, пересобирателей дистрибутивов приложений и любителей всяческих репаков.
Как известно, при ассоциации приложения к определенным типам файлам, встает проблема удаления однотипных разделов реестра, типа 7-zip.001, 7-zip.zip, 7-zip.rar, 7-zip.7z и т.д
Приходится делать рутинную работу, ведь в скрипте нужно прописывать десятки, а порою и сотни записей на удаления подразделов реестра, под каждое расширение - это весьма отнимает нервы и время.
Данный модуль (заголовочный файл) сделает за вас эту рутинную работу, всего лишь одной командой.
${DelRegKey} [корневой раздел реестра] [ветка реестра] [заданная маска]
Пример использования:
Копируем файл DelRegKey.nsh в папку NSIS\include
!include "DelRegKey.nsh"
${DelRegKey} HKLM "Software\Classes" "7-zip"
${DelRegKey} HKEY_CURRENT_USER "Software\Classes" "7-zip"
${DelRegKey} HKCR "" "7-zip"
В этом примере удалятся все разделы в HKLM в ветке Software/Classes начинающиеся с имени 7-zip, т.е по маске: 7-zip.001, 7-zip.zip, 7-zip.rar, 7-zip-7z и т.д.
Для корневого раздела HKCR поддерживается только запись с пустой веткой, так как там нет стандартных веток.
${DelRegKey} HKCR "" [заданная маска]
В следующем примере удалятся все подразделы в ветке Software начинающиеся на букву m
${DelRegKey} HKLM "Software" "m"
Пример использования:
${DelRegValue} [корневой раздел реестра] [ветка реестра] [заданная маска]
Удалятся все параметры ключей реестра со значением 7-zip*******
!include "DelRegKey.nsh"
${DelRegValue} HKLM "Software\Classes" "7-zip"
${DelRegValue} HKEY_CURRENT_USER "Software\Classes" "7-zip"
${DelRegValue} HKCR "7-Zip.7z" "7-zip"
${DelRegValue} HKCR "" "7-zip"
*****
В окне деталей показываются удаленные ключи, если в окне деталей ничего нет - значит идет поиск!
Указывайте ветку реестра, насколько возможно точнее, это нужно
для сокращения времени поиска, которое может длиться весьма продолжительное время!
*****
Поиск ведется только на строковые параметры: REG_SZ и REG_EXPAND_SZ
*********************************************************************
Для полноценной работы модуля требуется плагин Registry:
http://nsis.sourceforge.net/Registry_plug-in
*********************************************************************
БУДЬТЕ ВНИМАТЕЛЬНЫ В ВЫБОРЕ МАСКИ УДАЛЕНИЯ !!!!!!!!!!
Если кто-то не понял как пользоваться данным модулем, то лучше просто не пользуйтесь и не задавайте глупых вопросов.
но мы не ищем легких путей... »
Тогда помести в свои папки по скрытому файлику без расширения нулевого размера.
kotkovets,
А можно расширить функционал DelRegKey.nsh, поручив ему удалять по маске значения в ключах ?
т.е. ${DelRegKey} HKLM "Software/Classes" "любой ключ" "любое значение, начинающееся с 7-zip"
kotkovets
15-04-2011, 13:01
MKN, Я уже подумываю над этим, на днях выложу.
wolkow70
15-04-2011, 14:18
Тогда помести в свои папки по скрытому файлику без расширения нулевого размера. »
Такая мысль мне уже приходила. Нет уж, я лучше создам в скрипте пустые папки, хотя странно, что функционал NSIS не предусматривает такую мелочь....
kotkovets
15-04-2011, 14:47
После установки программы в тихой установке с ключом /S, установленная программа сразу же запускается, что надо прописать чтоб запуска программы не было или сможет как нибудь убить этот процесс »
Избитый вопрос...
Можно так:
start /w Setup.exe /S
TASKKILL /F /IM процесс.exe
Но окошко моргнет...
А лучше всего сделать репак дистра.
установленная программа сразу же запускается »
А с какой стати ей сразу запускаться, если сам же не попросишь в скрипте ?
kotkovets
18-04-2011, 10:34
А можно расширить функционал DelRegKey.nsh, поручив ему удалять по маске значения в ключах ? »
Добавлена такая возможность:
Читать внимательно тут (http://forum.oszone.net/post-1658900-1071.html)
Добрый день. Используясь NSIS написал собственный инсталятор, но столкнулся с одной проблемой. Во время установки пользователь вводит логин и пароль, которые инсталлятор заносит в params.ini. Этого я успешно добился (с помощью изучения вашего форума, кстати говоря). но возникла следующая ситуация. По принципу "as is" программа ругается на неверный логин/пароль. Дело в том, что в ней заложена своя система шифрования, и в .ini заносится уже шифрованое значение.
Для примера, пароль 123, если ввести это значение в самой программе, то в params.ini запишется “vќ. А мой инсталлятор записывает как есть, тоесть 123.
Есть .dll, в которой прописал алгоритм шифрования. Я так понимаю, надо в процессе установки сохранить пароль, введённый пользователем, вызвать функцию шифрования, зашифровать, а затем сохранить значение в .ini. Можно ли каким-нибудь образом обратиться из инсталлятора к .dll-ке?
kotkovets
18-04-2011, 17:46
Можно ли каким-нибудь образом обратиться из инсталлятора к .dll-ке? »
можно, теоретически, поместив соответствующую библиотеку в папку plugins NSIS и скомпильте какой-нибудь, любой скрипт. В логе компиляции вы увидите имя библиотеки (к примеру я закинул test.dll) и функции этой библиотеки, типа test::my_function и на этом все закончится....
Дело в том вы названия функции знаете, а прототип функции не знаете!
с какими параметрами вызывать, что передавать, какие аргументы функции и т.д. Обращаетесь к разработчикам библиотеки....ага засада! Так уж они вам все расскажут - алгоритм шифрования и дешифрования...
Так уж они вам все расскажут - алгоритм шифрования и дешифрования... »
Разработчик библиотеки сидит в соседнем кабинете, так что пример шифрования/дешифрования он мне сегодня утром показал:) Я просто ещё не углублялся в эту тему, расчитывал по лёгкой прикрутить функцию и всё.
В любом случае, спасибо за совет, буду разбираться. Если кому будет интересно, потом скину пример.
kotkovets
18-04-2011, 21:58
Shukaj,
Тогда уж лучше написать как плагин к NSIS c теме же алгоритмами работы как у приложения.
Здесь хедеры для этих дел, для обмена данными библиотеки и установщика.
http://forum.oszone.net/attachment.php?attachmentid=40323&d=1266850604
Можно вызывать "чужую библиотеку" с помощью стандартного плагина System.dll (Docs\System\System.html)
К сожалению, пока ничего не получается. По идее, вызываю Crypt.dll (в ней 2 функции:
function DeCode(const _Str: Pointer): Pointer; stdcall; из кодированной строки в обычную
function Code(const _Str: Pointer): Pointer; stdcall; из обычной строки в кодированную)
Вот кусок кода в инсталляторе.
Section
InitPluginsDir
SetOutPath $PLUGINSDIR
File Crypt.dll
System::Call "Crypt::Code($R1) $R2"
SectionEnd
Но ничего не происходит. Я так понимаю, проблема в том, что Crypt.dll написана на делфи.
пример использования Crypt.dll:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
dh: cardinal;
DeCode: function (const _Str: Pointer): Pointer; stdcall;
Code: function(const _Str: Pointer): Pointer; stdcall;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s := Edit1.Text;
Edit2.Text := String(Code(@s)^);
Edit3.Text := String(DeCode(@s)^);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(dh);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
DH := LoadLibrary('Crypt');
@DeCode := GetProcAddress(dh,'DeCode');
@Code := GetProcAddress(dh,'Code');
end;
end.
Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC