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

» Inno Setup (создание инсталяционных пакетов)

Автор: NightW0lf
Дата сообщения: 30.12.2006 19:41
maxdddca123
Если я на самом легком скрипте в котором нет даже секции [Code] использую файл РТФ то все его форматирование работает, а вот если скрипт использую который связан с фоновой картиной БМП (из руководства Kindly) то форматирование перестает работать!

И еще можно как нибудь изменить текст диалога на странице заверщения установки(не через Russian.isl)?
Автор: maxdddca123
Дата сообщения: 30.12.2006 20:55
Genri
Помоги ещё в таком вопросе: значт я хочу закрыть перед началом установки 1 окно в программе (сама программа пусть работает). Нашёл его класс прогой antivirTaskManager
Прописал код вот так:
procedure InitializeWizard();
var
s:string;
h:Longint;
begin
h:=FindWindowByClassName('Afx:400000:b:10011:6:709e3');
If h<>0 then
begin
s:='Программа установки обнаружила, что сейчас' #13'одна из копий программы My_Program выполняется.' #13#13'Сейчас она будет принудительно закрыта.';
MsgBox(s, mbError, mb_Ok);
SendMessage(h, 16, 0, 0); //Вот это и есть закрытие программы
end; end;

Но окно не закрывается. Подскажи в чём может быть дело ?
Автор: Genri
Дата сообщения: 31.12.2006 00:18
NightW0lf

Цитата:
Что-то твой код не работает!
-- Виноват. Как уже сказали пропущена строка. Исходное сообщение исправил.
По поводу форматирования - дай полностью код, который не работает.
Chanka

Цитата:
как сделать, чтобы картинка не растягивалась, а находилась по-центру
-- ну во-первых убрать растягивание которое у тебя True, а надо False:
BackgroundBitmapImage.Stretch:=False;
...а во-вторых, выставить по центру
BackgroundBitmapImage.Center:= True;
maxdddca123

Цитата:
Как сделать кнопку неактивной ? Приведи пример пожалуйста.
-- где-то на предыдущих страницах или в ПМ я тебе давал. Мне поискать или ваше благородие само справится?
Цитата:
я хочу закрыть перед началом установки 1 окно в программе (сама программа пусть работает)
-- я не понял, так это окно или копия программы? Что за программа? И откуда ты взял этот параметр - 'Afx:400000:b:10011:6:709e3'?
Автор: NightW0lf
Дата сообщения: 31.12.2006 09:42
Genri
Я тебе в личку отправил весь свой код!
Автор: Chanka
Дата сообщения: 31.12.2006 09:57
Genri,

Пасиб. Работает. Но почему-то фон стал, каким-то белым. Как это поправить?
Автор: maxdddca123
Дата сообщения: 31.12.2006 11:07
Genri
Вобщем это программа 1С, в которой можно открывать много всяких окон. (Ну например окно Справочники и окно Отчёты). Я прогой AnVir Task Manager нашёл именно то окно, которое мне нужно (У него заголовок полностью совпадает с тем, что я вижу в 1С), а этот параметр Afx:400000:b:10011:6:709e3 в проге AnVir Task Manager находится после названия окна и сивола " . Могу прислать скриншот на почту...
Автор: Genri
Дата сообщения: 31.12.2006 12:12
NightW0lf -- в личке от тебя ничего нет. Ничего не перепутал?

Chanka -- начиная с BackgroundBitmapImage := TBitmapImage.Create(MainForm) замени на следующее:
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
with BackgroundBitmapImage do
begin
AutoSize:= True;
Stretch:=False;
Center:= True;
Bitmap.LoadFromFile(s);
Align := alNone;
BackColor:= clBlue;
Parent := MainForm;
Left:= (MainForm.Width / 2) - (Width / 2);
Top:= (MainForm.Height / 2) - (Height / 2);
end;

maxdddca123 -- ты используешь FindWindowByClassName.
("А ты вот этот плакатик внимательно читал?" (С)Жиглов):
Цитата:
function FindWindowByClassName(const ClassName: String): HWND;
Описание:
Находит заголовок для верхнеуровневого окна, имя класса которого указано в заданной строке. Эта функция не ищет дочерние окна и не выполняет чувствительный к регистру (case-sensitive) поиск. Возвращает 0, если ни одного окна не найдено.


Автор: Chanka
Дата сообщения: 31.12.2006 12:30
Genri,

Спасибо! Всё гуд
Автор: NightW0lf
Дата сообщения: 31.12.2006 12:45
Genri
Вот мой проект
Автор: maxdddca123
Дата сообщения: 31.12.2006 13:13
Genri
Получается вообще нельзя закрыть доченрее окно средствами Inno?
Автор: Genri
Дата сообщения: 31.12.2006 13:47
NightW0lf -- в функции InitializeWizard у тебя есть строки:
WizardForm.Position:=poScreenCenter;
MainForm.BORDERSTYLE:=bsNone;
... которые вызывают пересоздание форм. Из-за этого и проблема.

Решить можно следующим способом:
1. В секцию [Files] добавить строку:
Source: "License.rtf"; DestDir: {tmp}; Flags: dontcopy noencryption

2. В процедуре InitializeWizard объявить еще одну переменную:
License: String;

3. После (обязательно после!) строк:
WizardForm.Position:=poScreenCenter;
MainForm.BORDERSTYLE:=bsNone;
...добавить:
ExtractTemporaryFile('License.rtf');
LoadStringFromFile(ExpandConstant('{tmp}')+'\License.rtf', License)
WizardForm.LicenseMemo.RTFText:= License;
Автор: NightW0lf
Дата сообщения: 31.12.2006 16:24
Genri
ОГРОМНОЕ ТЕБЕ СПАСИБО ЗА ПОМОЩЬ!
С наступающим Новым Годом!
Автор: svs123456789
Дата сообщения: 31.12.2006 18:18
Поздравляю всех с Новым годом!
и огромная благодарность Genri за его помощь!
желаю всем счастья и здоровья!
Автор: Chanka
Дата сообщения: 31.12.2006 18:27
Присоединяюсь к выше сказанному
Автор: NightW0lf
Дата сообщения: 01.01.2007 22:59
С Наступившим ВСЕХ!
Подскажите как можно сделать проверку прав пользователя при запуске инсталлятора (типа "для правильной работы инсталлятора нужны права администратора!" Вы уверены, что хотите продолжить? Да\Нет)?
Заранее благодарю!
Автор: Genri
Дата сообщения: 01.01.2007 23:43
NightW0lf
function IsAdminLoggedOn: Boolean;
Description:
Returns True if an administrator is logged onto the system. Always returns True on Windows 95/98/ME.
--------------
function IsPowerUserLoggedOn: Boolean;
Description:
Returns True if a Power User is logged onto the system. Always returns True on Windows 95/98/ME.

Добавлено:
---- Пример использования ----
function InitializeSetup(): Boolean;
begin
Result:= True;
if Not IsAdminLoggedOn then
begin
if MsgBox('Are you sure?', mbConfirmation, MB_YESNO) <> IDYES then
Result:= False;
end;
end;
Автор: NightW0lf
Дата сообщения: 02.01.2007 00:25
Genri
Спасибо попробую!

Добавлено:
А можно сделать так:

1. Чтобы после установки на странице завершения был пункт (с галочкой) перезагрузить компьютер?
2. Изменить текст на странице завершения в месте с название кнопки.
3. Создать резервную копию во время установки, и кнопку перед установкой "Создать резервную копию оригинальных файлов" с галочкой.

Заранее благодарю!
Автор: omals
Дата сообщения: 02.01.2007 11:03

Цитата:
А можно сделать так:
1. Чтобы после установки на странице завершения был пункт (с галочкой) перезагрузить компьютер


[Setup]: AlwaysRestart
Valid values:
yes or no
Default value:
no
Description:
When set to yes, Setup will always prompt the user to restart the system at the end of a successful installation, regardless of whether this is necessary (for example, because of [Files] section entries with the restartreplace flag).


Добавлено:

Цитата:
2. Изменить текст на странице завершения в месте с название кнопки

Можно делать по разному
1. ищем текст который там выводится в Default.isl (и все остальных) файлах языков
и меняем на свой текст
2. в файлах языков .isl записывам свое сообщение в [CustomMessages]
и потом его используем подменяя стандартное.

Автор: Genri
Дата сообщения: 02.01.2007 12:45
NightW0lf

Цитата:
Создать резервную копию во время установки, и кнопку перед установкой "Создать резервную копию оригинальных файлов" с галочкой
-- Пример [more=здесь..]
Код: [Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Compression=lzma
SolidCompression=yes
Uninstallable=no

[Tasks]
Name: arc; Description: "Create back&up"

[Files]
Source: Files\*.*; DestDir: {app}; BeforeInstall: CreateBackup

[Code]
var
Page: TInputDirWizardPage;
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
if IsTaskSelected('arc') then
begin
// if Not DirExists(ArcDir) then CreateDir(ArcDir);
ForceDirectories(ArcDir); // исправлено
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
If (CurPageID = Page.ID) then
ArcDir := Page.Values[0];
Result:= True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
If (PageID = Page.ID) and
(Not IsTaskSelected('arc')) then
Result:= True
else Result:= False;
end;

procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Select Backup Location',
'Where should backup files be stored?',
'To continue, click Next.' + #10#13#10#13 +
'If you would like to select a different folder, click Browse.',
False, 'Backup');
Page.Add('');
//Page.Values[0] := ExpandConstant('{sd}\Backup');
Page.Values[0] := AddBackslash(ExpandConstant('{sd}\Backup')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' ); // исправлено
end;
Автор: NightW0lf
Дата сообщения: 02.01.2007 16:44
Genri
Спасибо работает!
Но вот у меня еще возник один вопросик по поводу "Резервных копий".
Вопрос:
Теперь мне надо чтобы инсталлятор заменил оригинальный файл (на пример - myprog1.exe) на такой же, но только обновленный, и во время установки в директории программы была сразу создана папка "Backup_Files" (т.е. у пользователя инсталлятор не должен спрашивать ни название папки, ни где размещать ее, а нужно чтобы инсталлятор создавал все сам автоматически).
Автор: Genri
Дата сообщения: 02.01.2007 17:14
NightW0lf

Цитата:
у пользователя инсталлятор не должен спрашивать ни название папки, ни где размещать ее, а нужно чтобы инсталлятор создавал все сам автоматически
-- Берем предыдущий скрипт и удаляем все лишнее
Код:
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Compression=lzma
SolidCompression=yes
Uninstallable=no

[Files]
Source: Files\*.*; DestDir: {app}; BeforeInstall: CreateBackup

[Code]
var
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
ArcDir:= AddBackslash(ExpandConstant('{app}\Backup')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' );
ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
Автор: Mihagod
Дата сообщения: 02.01.2007 17:53
Подскажите как разбить сетап на части? а то он делает всё одним файлом, и по достижении двух гигабайт удаляется.
Буду очень признателен, заранее спасибо!
Автор: NightW0lf
Дата сообщения: 02.01.2007 18:16
Mihagod

Цитата:
Подскажите как разбить сетап на части? а то он делает всё одним файлом, и по достижении двух гигабайт удаляется.


Код:
[Setup]
DiskSpanning=yes
;Размер тома в байтах (здесь 695 мегабайт, уменьшите значение, если вы записываете меню автозапуска)
DiskSliceSize=730000000
Автор: Genri
Дата сообщения: 02.01.2007 18:37
NightW0lf -- [more=Здесь]
Код: #define MaxBackup 3

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
Compression=lzma
SolidCompression=yes
Uninstallable=no

[Files]
Source: Files\*.*; DestDir: {app}; BeforeInstall: CreateBackup

[Code]
var
ArcDir: String;
DirNames: TStringList;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
ArcDir:= AddBackslash(ExpandConstant('{app}\Backup')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' );
ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;

procedure GetBackupCount();
var
FindRec: TFindRec;
begin
if FindFirst(ExpandConstant('{app}\Backup\*'), FindRec) then begin
try
DirNames:= TStringList.Create();
DirNames.Sorted:= True;
repeat
if (FindRec.Attributes = FILE_ATTRIBUTE_DIRECTORY) and
(FindRec.Name <> '.') and (FindRec.Name <> '..') then
begin
DirNames.Append(FindRec.Name);
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
i: integer;
begin
if CurStep = ssInstall then
begin
GetBackupCount();
if DirNames.Count >= StrToInt(ExpandConstant('{#MaxBackup}')) then
begin
for i:= DirNames.Count - StrToInt(ExpandConstant('{#MaxBackup}')) downto 0 do
begin
DelTree(ExpandConstant('{app}\Backup\') + DirNames[i], True, True, True);
end;
end;
end;
end;
Автор: NightW0lf
Дата сообщения: 02.01.2007 18:42
Genri
Работает, НО не совсем - т.е. почему-то не получается переписать (заменить) файл myprog1.exe на такойже, но только обновленный.
И как сделать чтобы деинсталлятор от программы обновления мог удалить обновленный файл и папку с резервной копией и если это возможно вернуть оригинальный файл из папки с резервной копией на место.

Буду ОЧЕНЬ признателен!!
Автор: Genri
Дата сообщения: 02.01.2007 19:42
NightW0lf

Цитата:
не получается переписать (заменить) файл myprog1.exe на также, но только обновленный.
-- если я правильно понял, то не получается проапдейтить файл, а не сохранить в бэкап копию файла. Тогда проблема у тебя в скрипте. Давай скрипт.


Добавлено:
... либо myprog1.exe в момент апдейта запущен.
Автор: NightW0lf
Дата сообщения: 02.01.2007 20:06
Genri

Цитата:
-- если я правильно понял, то не получается проапдейтить файл

Да ты понял правиьно именно это я хочу.

Я сейчас эксперементирую на обычном скрипте!

Но если надо [more=то вот скрипт патча]
[Setup]
AppName=My Program PATCH
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\Vmd
DefaultGroupName=My Program
OutputDir=C:\SETUP
OutputBaseFilename=setup_patch
Compression=lzma
LicenseFile=C:\SETUP_FOR\_WC3_TH\RTF_FILES\License.rtf
SolidCompression=yes
UninstallLogMode=overwrite
Uninstallable=yes

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: arc; Description: "Создать резервную копию оригинальных файлов "


[Files]
Source: "C:\MyProg.exe"; DestDir: {app}; BeforeInstall: CreateBackup; Flags: onlyifdoesntexist uninsneveruninstall
;MyProg.exe - оригинальный файл уже установлен
;C:\MyProg.exe - обновленный файл!


[Run]
Filename: "{app}\MyProg.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent
;"{app}\MyProg.exe" должен запуститься обновленный файл!

[Code]
var
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
ArcDir:= AddBackslash(ExpandConstant('{app}\Backup_Files'))
ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
[/more]
Автор: Genri
Дата сообщения: 02.01.2007 21:12
NightW0lf -- у тебя в скрипте строка:
Source: "C:\MyProg.exe"; DestDir: {app}; BeforeInstall: CreateBackup; Flags: onlyifdoesntexist uninsneveruninstall

Цитата из хелпа:
Цитата:
onlyifdoesntexist
Устанавливает файл только в случае, если такого файла в системе пользователя нет.

Намек понял?

Автор: NightW0lf
Дата сообщения: 02.01.2007 21:21
Genri
С ним или без него "Flags: onlyifdoesntexist" все равно!


Цитата:
Не получается переписать (заменить) файл myprog.exe на такой же, но только обновленный.
И как сделать чтобы деинсталлятор от программы обновления мог удалить обновленный файл и папку с резервной копией и если это возможно вернуть оригинальный файл из папки с резервной копией на место.



Добавлено:
Genri
Вот пример инсталлятора где реализовано то что хочу!
P.S.: Размер его ~550 килобайт
Автор: Genri
Дата сообщения: 02.01.2007 22:06
NightW0lf -- добавь флаг:
Flags: ignoreversion

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: ICONS


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