PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [54] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

david141
12-04-2011, 19:36
Может, кто знает, что за ошибка?
Invalid command: ${LocateNoDetails}
Error in macro CopyFilesFromDir on macroline 34

Вот исходник (http://ifolder.ru/22925369) firefox-installer
Может, кто разберётся и выложит рабочий?

Didgik
13-04-2011, 14:54
Народ привет!
А можно как нибудь получить версию файла на этапе компиляции?
Нужно для вписывания версии в имя инсталяшки.
Как я понял ${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

Didgik
14-04-2011, 13:03
kotkovets, хитро. Спасибо. )
Но жаль что нет штатного средства. А так мне всё равно надо будет передавать кое-какие параметры через /D так что буду и версию передавать.

wolkow70
15-04-2011, 05:44
Товарищи, подскажите как включить в инсталлятор пустые папки?
Пробовал с помощью функции InstallFolderInternal, папки с файлами включаются в установщик, а пустые нет.

MKN
15-04-2011, 08:53
как включить в инсталлятор пустые папки? »
Лучше пустые папки создавать (с необходимыми путями и именами)

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

*********************************************************************
БУДЬТЕ ВНИМАТЕЛЬНЫ В ВЫБОРЕ МАСКИ УДАЛЕНИЯ !!!!!!!!!!
Если кто-то не понял как пользоваться данным модулем, то лучше просто не пользуйтесь и не задавайте глупых вопросов.

MKN
15-04-2011, 12:51
но мы не ищем легких путей... »
Тогда помести в свои папки по скрытому файлику без расширения нулевого размера.

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
Но окошко моргнет...
А лучше всего сделать репак дистра.

MKN
15-04-2011, 15:16
установленная программа сразу же запускается »
А с какой стати ей сразу запускаться, если сам же не попросишь в скрипте ?

kotkovets
18-04-2011, 10:34
А можно расширить функционал DelRegKey.nsh, поручив ему удалять по маске значения в ключах ? »
Добавлена такая возможность:
Читать внимательно тут (http://forum.oszone.net/post-1658900-1071.html)

Shukaj
18-04-2011, 17:11
Добрый день. Используясь 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 и на этом все закончится....
Дело в том вы названия функции знаете, а прототип функции не знаете!
с какими параметрами вызывать, что передавать, какие аргументы функции и т.д. Обращаетесь к разработчикам библиотеки....ага засада! Так уж они вам все расскажут - алгоритм шифрования и дешифрования...

Shukaj
18-04-2011, 19:42
Так уж они вам все расскажут - алгоритм шифрования и дешифрования... »
Разработчик библиотеки сидит в соседнем кабинете, так что пример шифрования/дешифрования он мне сегодня утром показал:) Я просто ещё не углублялся в эту тему, расчитывал по лёгкой прикрутить функцию и всё.
В любом случае, спасибо за совет, буду разбираться. Если кому будет интересно, потом скину пример.

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)

Shukaj
21-04-2011, 08:25
К сожалению, пока ничего не получается. По идее, вызываю 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