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

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

Автор: iTASmania_Inc
Дата сообщения: 22.05.2007 20:47
Victor_Dobrov
Тебе тоже ОГРОМНОЕ спасибо за доработку DelSP!
Автор: Genri
Дата сообщения: 22.05.2007 21:45
GloThin
Цитата:
Чтобы это значило?
-- ограничение LongWord

iTASmania_Inc -- так функция Trim помогла или нет?
Автор: GloThin
Дата сообщения: 22.05.2007 21:59

Цитата:
GloThin
Цитата:Чтобы это значило?
-- ограничение LongWord

Не понял? причем тут это ограничение, вернее переход в минуса при превышении максимального значения....
насколько помнится максимальное значение лонгинт никак не больше 2000000000 байт..
А почему не использовать лонгинт вместь лонгворд?
Щас проверю.....
Автор: Sero
Дата сообщения: 22.05.2007 22:36
Помогите с этим скриптом! плииииз!
Автор: Genri
Дата сообщения: 22.05.2007 23:00
GloThin
Код:
function InitializeSetup(): Boolean;
var
curr: Currency;
lw: LongWord;
li: LongInt;
begin
lw := 2147483647;
curr:= 2147483647;
li:= 2147483647;
MsgBox('LongInt = ' + FloatToStr(li) + #10#13 +
'LongWord = ' + FloatToStr(lw)+ #10#13 +
'Currency = ' + FloatToStr(curr), mbInformation, MB_OK);

lw:= lw + 1;
curr:= curr + 1;
li:= li + 1;

MsgBox('LongInt = ' + FloatToStr(li) + #10#13 +
'LongWord = ' + FloatToStr(lw)+ #10#13 +
'Currency = ' + FloatToStr(curr), mbInformation, MB_OK);
end;
Автор: Victor_Dobrov
Дата сообщения: 23.05.2007 01:14

Цитата:
заметил интересную картинку - не удержался сделал скрин....
Чтобы это значило?.


Когда результат более $80000000, знак меняется на -, как это исправить?
В самой функции ловушки и замена (...): Longword на Currency ничего не меняет

[Setup]
AppName=CalcDirSize
AppVerName=CalcDirSize
DefaultDirName={pf}\CalcDirSize

[Code]
Function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Longword;
var FSR, DSR: TFindRec; APath: string; FindResult: Boolean;
    Begin
        APath:= AddBackslash(fromDir);
FindResult:= FindFirst(APath + fileMask, FSR);
Try
while FindResult do
begin
    if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Result:= Result +(FSR.SizeLow);
    FindResult:= FindNext(FSR);
end;
    FindResult:= FindFirst(APath + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
    if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
    {Recursion} Result:= Result + CalcDirSize(APath + DSR.Name, fileMask, SubDirsAllow);
    FindResult:= FindNext(DSR);
end;
Finally
    FindClose(FSR); FindClose(DSR);
end;
End;

Procedure DirOnClick(Sender: TObject); var UserSelectDir: String; res: Longword;
    Begin
UserSelectDir:= WizardForm.DirEdit.Text
If BrowseForFolder('Выберите папку для установки или создайте новую', UserSelectDir, True) then
    begin
        WizardForm.DirEdit.Text:= UserSelectDir
        res:= CalcDirSize(UserSelectDir, '*', True)/(1024*1024);    //результат в Мб
        If res < 1000 then MsgBox(IntToStr(res)+ ' Mb', mbInformation, MB_OK) else
        MsgBox(FloatToStr(round(res/1024*1000)/1000)+ ' Gb', mbInformation, MB_OK)
    end;
End;

Procedure InitializeWizard;
Begin
    WizardForm.DirBrowseButton.OnClick:= @DirOnClick;
End;
Автор: boss911
Дата сообщения: 23.05.2007 02:01
Genri

Я что-то совсем запутался! Так правильно будет:

Код: MinVersion=0,5.01.2600sp2
Автор: GRom V
Дата сообщения: 23.05.2007 06:22
Люди подскажите пожалуйсто кто нить - КАК УБИТЬ не убиваемый процесс, например kav.exe ?
Автор: Chuvakstepan
Дата сообщения: 23.05.2007 07:15
Sero
Не работает твой скрипт, даже не компилится
Автор: Sampron
Дата сообщения: 23.05.2007 11:33
Кто может помочь с этим вопросом: http://data.cod.ru/1027833290
Нужно форму сделать подвижной и сворачивание формы в панель задач при нажатии на кнопку Minimize.
Автор: maxdddca123
Дата сообщения: 23.05.2007 15:30
Sampron

Цитата:
Радиобаттоны не поддерживают свойство Transparent, и это исправить нельзя только цвет можно изменить.

А как менять цвет ?
Автор: Sero
Дата сообщения: 23.05.2007 17:30
maxdddca123

Цитата:
А как менять цвет ?


...Color := цвет

Добавлено:
Например:

var RadioButton: TRadioButton;
.....
.....
with RadioButton do begin
Color := clNavy
Parent := WizardForm
Top:=....
Left:=....
end

Добавлено:
Chuvakstepan

Цитата:
Не работает твой скрипт, даже не компилится

Я не тестировал!
Автор: ZavadS
Дата сообщения: 24.05.2007 00:17
Нужна помощь. Как можно сделать это. Перед началом русификации нужно закрыть два процесса, эти же прочеси нужно опять запустить по окончании русификации. И такую же процедуру, но только уже во время удаления русификатора.
Автор: Genri
Дата сообщения: 24.05.2007 01:45
Victor_Dobrov
Цитата:
Когда результат более $80000000, знак меняется на -, как это исправить?
В самой функции ловушки и замена (...): Longword на Currency ничего не меняет
-- задача оказалась весьма любопытной, хотя и не имеющей ничего общего с математикой "Исправить" знак не выйдет (по крайней мере пока разработчик не перейдет на более новую версию делфи). Этот "минус" на самом деле ... не совсем минус Даже если у переменной знак "поменялся", условие if Size > 0 будет ... истинным

Но задача все-таки имеет решение. И хотя, в силу кривизны математики, мне оно не очень нравится, но, как ни странно, удалось добиться вроде правильного подсчета даже для очень больших файлов.

Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Code]
function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Extended;
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
Hi, Lo: Extended;
begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
if FSR.SizeLow > 2147483647 then
Lo:= FSR.SizeLow + 2147483647 + 2147483647 + 2
else
Lo:= FSR.SizeLow;
Result := Result + Lo;
(* Hi:= FSR.SizeHigh; // Надо так,
Lo:= FSR.SizeLow; // но так не работает
If Hi < 0 Then Hi:= Hi + (65536*65536);
If Lo < 0 Then Lo:= Lo + (65536*65536);
Result := Result+((Hi * (65536*65536)) + Lo); *)
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} Result:= Result + CalcDirSize(APath + DSR.Name, fileMask, SubDirsAllow);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

function InitializeSetup(): Boolean;
var
res: Extended;
begin
res:= CalcDirSize('C:\Temp', '*', True);
MsgBox(FloatToStr(res)+ '', mbInformation, MB_OK);
end;
Автор: Victor_Dobrov
Дата сообщения: 24.05.2007 02:02
Вот более тупой вариант:

Function DirSize(const fromDir: String): Currency;
    var ArrOfFiles: TArrayOfString; St: String; errorCode: Integer;
Begin
    Exec(ExpandConstant('{cmd}'), ExpandConstant('/C dir /w /s >{tmp}\DirSize.lst'), ExpandConstant(fromDir), sw_Hide, ewWaitUntilTerminated, errorCode);
    LoadStringsFromFile(ExpandConstant('{tmp}\DirSize.lst'), ArrOfFiles);
    St:=ArrOfFiles[GetArrayLength(ArrOfFiles)-2];
    OemToCharBuff(St);
    StringChange(St, Chr($A0), '');
    Result:=StrToFloat(Trim(Copy(St, Pos('файлов', St)+8, Pos('байт', St)-2-(Pos('файлов', St)+7))));
End;

Procedure DirOnClick(Sender: TObject); var UserSelectDir: String; res: Integer;
    Begin
UserSelectDir:= WizardForm.DirEdit.Text
If BrowseForFolder('Выберите папку для подсчёта её размера:', UserSelectDir, True) then
    begin
        WizardForm.DirEdit.Text:= UserSelectDir
        res:= Trunc(DirSize(UserSelectDir)/(1024*1024))    //результат в Мб
        If res < 1000 then MsgBox(IntToStr(res)+ ' Mb', mbInformation, MB_OK) else
        MsgBox(FloatToStr(round(res/1024*1000)/1000)+ ' Gb', mbInformation, MB_OK)
    end;
End;

Procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
    Begin If CurPageID <> wpInstalling then Confirm:= False; End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
If CurPageID = wpWelcome then WizardForm.NextButton.OnClick(WizardForm.NextButton)
End;

Procedure InitializeWizard;
Begin
    WizardForm.DirBrowseButton.OnClick:= @DirOnClick
End;
Автор: Genri
Дата сообщения: 24.05.2007 02:22
Victor_Dobrov -- тоже вариант. У меня система аглицкая, так что вживую проверить не смог, а перекраивать под себя поленился. Но на взгляд вполне работоспособный вариант. Только я бы посоветовал параметр /C заменить на /-C (для упрощения скрипта)


Добавлено:
boss911

Цитата:
MinVersion=0,5.01.2600sp2
.......................................
Если не правильно, то напиши плиз как надо
-- не волнуйся, все правильно
В этом варианте инсталлятор НЕ запустится (точнее выдаст предупреждение и отвалится) на следующих системах:


4.0.950 Windows 95
4.0.1111 Windows 95 OSR 2 & OSR 2.1
4.0.1212 Windows 95 OSR 2.5
4.1.1998 Windows 98
4.1.2222 Windows 98 Second Edition
4.9.3000 Windows Me

Windows NT versions:

4.0.1381 Windows NT 4.0
5.0.2195 Windows 2000
5.01.2600 Windows XP
or Windows XP 64-Bit Edition Version 2002 (Itanium)
5.01.2600sp1 Windows XP SP1


Но начиная с 5.01.2600sp2 Windows XP SP2 все прекрасно будет работать (я так думаю)
Автор: marat shakirov
Дата сообщения: 24.05.2007 08:02
У меня вопрос появился. Теперь уже последний. Потерял пример задания переменных окружения. Мне надо задать 2 переменных и дописать PATH. И как при деинсталляции грамотно все это вычистить?
Автор: Genri
Дата сообщения: 24.05.2007 10:44
marat shakirov
Майкрософт рекомендует

Цитата:

You can modify user environment variables by editing the following Registry key:
HKEY_CURRENT_USER \ Environment
                
You can modify system environment variables by editing the following Registry key:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment
Автор: Sampron
Дата сообщения: 24.05.2007 11:10
Как можно изменить порядок выполнения страниц чтобы сначала была страница с выбором компонентов а потом выбор папки установки?
Автор: fty
Дата сообщения: 24.05.2007 11:13
Genri
Глянь в личку, плиз.
Автор: Victor_Dobrov
Дата сообщения: 24.05.2007 13:00
Проверка системных требований. Устранены все замечания. Добавил показ файловой системы дисков.

Вызов сведений из любой страницы; Проверка: версии Windows и Service Pack, оборудования, программы пользователя, системных папок, щелчок по компоненту в таблице открывает свойства.
Автор: boss911
Дата сообщения: 24.05.2007 16:34
Genri

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

Спасибо!

Теперь вот вопрос такой: хочу, чтоб инсталлятор мог устанавливать только на XP SP2 и больше ни в какой системе, как правльно написать, может, совместить MinVersion и OnlyBelowVersion? Что вписать в OnlyBelowVersion?
Автор: ZavadS
Дата сообщения: 25.05.2007 01:10
Genri Этот код закрывает два процесса перед началом русификации. А как сделать код, который будет закрывать эти же процессы, но уже перед началом удаления русификатора?

function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('oodcnt.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('oodcnt.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('oodtray.exe', false) then
begin
KillTask('oodtray.exe');
Result := True;
end else
Exit;
end;
end;
Автор: Genri
Дата сообщения: 25.05.2007 01:18
boss911
Цитата:
чтоб инсталлятор мог устанавливать только на XP SP2 и больше ни в какой системе


MinVersion=0,5.01sp2
OnlyBelowVersion=0,5.01sp3

Я знаю многих людей, кто не любит сервиспаки, но чтобы на столько?!

Добавлено:
ZavadS -- точно так же, только используя function InitializeUninstall(): Boolean; вместо function InitializeSetup(): Boolean;

Ну и соответственно поменять или убрать диалоги.
Автор: boss911
Дата сообщения: 25.05.2007 02:47
Genri

Цитата:
MinVersion=0,5.01sp2
OnlyBelowVersion=0,5.01sp3

Хм, а чего выкинул сборку 2600 ? А так, что не правильно будет, ненадежней разве:

Код: MinVersion=0,5.01.2600sp2
OnlyBelowVersion=0,5.01.2600sp3
Автор: krez0n
Дата сообщения: 25.05.2007 08:55
подскажите как в зависимости от того какой компонент выбран показывать или скрывать следующую форму?
т.е. как получить значения списка компонентов, чтобы их можно было проверить?
Автор: Genri
Дата сообщения: 25.05.2007 09:14
boss911
Цитата:
а чего выкинул сборку 2600 ?
-- Из хелпа:
Цитата:
If a build number is not specified or is zero, Setup will not check the build number.
-- т.е. если билд не указан, он не проверяется.
В данном случае, я думаю тебе, тебе без разницы - указывать билд или нет

krez0n
function WizardSelectedComponents(const Descriptions: Boolean): String;
function IsComponentSelected(const Components: String): Boolean;
Автор: krez0n
Дата сообщения: 25.05.2007 09:17
Genri
а примера поконкретнее нет?
Автор: NightW0lf
Дата сообщения: 25.05.2007 09:52
ZavadS

Цитата:
А как сделать код, который будет закрывать эти же процессы, но уже перед началом удаления русификатора?

Есть такой вариант:

Код:
Реагирование инсталлятора на класс окна запущенного приложения.
Класс окна приложения можно определить программкой View Window (http://sottnick.narod.ru/). Внимание: программка может не работать в Windows XP при включении «красивостей», нужно отключить все визуальные эффекты для корректной работы программки.
Перед процессом установки программа не позволит инсталляцию файлов, если запущена «проверямая» программа (действия происходят непосредственно перед установкой).

function InitializeUninstall(): Boolean;
var
s:string;
h:Longint;
begin
Result:=True;
h:=FindWindowByClassName('My-Program-WINDOW');
If h<>0 then
begin
s:='Обнаружен запущенный экземпляр программы My_Program!' #13#13'Для запуска мастера удаления требуется закрыть его.';
MsgBox(s, mbError, mb_Ok);
Result:= False
end;
end;
//Выход программы деинсталляции при обнаружении запущенной программы с соответствующим сообщением.
Автор: ZavadS
Дата сообщения: 25.05.2007 10:21
Genri

Цитата:
точно так же, только используя function InitializeUninstall(): Boolean; вместо function InitializeSetup(): Boolean;


Я так делал. Запускаю удаление русификатора, выскакивает вот такая ошибка

Цитата:
Runtime Error (at 27:66):

Could not call proc.


Код
#include "SHFileOperation.iss"

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallFilesDir={app}\Install_Rus
CreateAppDir=true
AlwaysRestart=true

[Tasks]
Name: src; Description: Backup

[Files]
Source: MyProg.exe; DestDir: {app}; BeforeInstall: CreateBackup; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ..\..\Program Files\Inno Setup Scripting v5.0\Addons\Libraries\ISTask.dll; DestDir: {tmp}; Flags: dontcopy

[Code]
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Install_Rus\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
RemoveDir(ExpandConstant('{app}\Install_Rus\'));
end;
end;

function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('corr.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('corr.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('pra.exe', false) then
begin
KillTask('pra.exe');
Result := True;
end else
Exit;
end;
end;


function InitializeUninstall(): Boolean;
begin
If RunTask('corr.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой удаляется русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTask('corr.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTask('pra.exe', false) then
begin
KillTask('pra.exe');
Result := True;
end else
Exit;
end;
end;








Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


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