PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]


Страниц : 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

kotyarko@fb
17-02-2016, 18:34
Reyesahydo, RegWriteStringValue(HKEY_CURRENT_USER, 'Software\AAAAA-AAAAA-AAAAA-AAAAA', '', '');

Reyesahydo
17-02-2016, 18:57
Код:
RegWriteStringValue(HKEY_CURRENT_USER, 'Software\AAAAA-AAAAA-AAAAA-AAAAA', '', ''); »


А как записать вот сюда ?

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Valve\Half-Life\Settings]
"ValveKey"="AAAAA-AAAAA-AAAAA-AAAAA-AAAAA"

Мне ключ нужно именно передач вот этому параметру
И напишите пожалуйста куда именно нужно это нужно писать

Raf-9600
17-02-2016, 20:14
Нашёл вроде бы неплохой код для проверки на наличие определённого обновления Windows https://theroadtodelphi.wordpress.com/2011/03/02/search-for-installed-windows-updates-using-delphi-wmi-and-wua/

function ISHotFixID_Installed(const HotFixID : string): Boolean;
var
updateSession : OleVariant;
updateSearcher : OleVariant;
updateEntry : OleVariant;
updateSearchResult : OleVariant;
UpdateCollection : OleVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin
result:=False;
updateSession:= CreateOleObject('Microsoft.Update.Session');
updateSearcher := updateSession.CreateUpdateSearcher;
//this line improves the performance , the online porperty indicates whether the UpdateSearcher goes online to search for updates. so how we are looking for already installed updates we can set this value to false
updateSearcher.online:=False;
updateSearchResult:= updateSearcher.Search(Format('IsInstalled = 1 and Type=%s',[QuotedStr('Software')]));
UpdateCollection := updateSearchResult.Updates;
oEnum := IUnknown(UpdateCollection._NewEnum) as IEnumVariant;
while oEnum.Next(1, updateEntry, iValue) = 0 do
begin
Result:=Pos(HotFixID,updateEntry.Title)>0;
updateEntry:=Unassigned;
if Result then break;
end;
end;

Однако проблема в том, что он несовместим с Inno. В частности компилятор жалуется на OleVariant и IEnumvariant. Кто-то может это исправить?

kotyarko@fb
17-02-2016, 20:29
А как записать вот сюда ? »Так:RegWriteStringValue(HKEY_CURRENT_USER, 'Software\Valve\Half-Life\Settings', 'ValveKey', 'AAAAA-AAAAA-AAAAA-AAAAA-AAAAA');

Reyesahydo
17-02-2016, 20:35
Так:
Код:
RegWriteStringValue(HKEY_CURRENT_USER, 'Software\Valve\Half-Life\Settings', 'ValveKey', 'AAAAA-AAAAA »

Куда его именно нужно писать ?

saurn
17-02-2016, 21:39
Использую только официальные версии! »
procedure _CancelClick ( const Sender: TObject );
begin
WizardForm.CancelButton.OnClick ( Sender );
end;

======================================================================

Куда его именно нужно писать ? »
Для этой задачи вполне достаточно секции Registry, без оперирования в коде.
[Registry]
Root: HKCU; Subkey: "Software\Valve\Half-Life\Settings"; ValueType: string; ValueName: "ValveKey"; ValueData: "AAAAA-AAAAA-AAAAA-AAAAA-AAAAA"; Flags: deletevalue;

Reyesahydo
18-02-2016, 11:37
[Registry]
Root: HKCU; Subkey: "Software\Valve\Half-Life\Settings"; ValueType: string; ValueName: "ValveKey"; ValueData: "AAAAA-AAAAA-AAAAA-AAAAA-AAAAA"; Flags: deletevalue;

Код работает не всегда (Через раз)
Можете показать как сделать код через секцию [Code] ?

kotyarko@fb
18-02-2016, 11:54
Можете показать как сделать код через секцию [code] ? »Например:
Procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
RegWriteStringValue(HKEY_CURRENT_USER, 'Software\Valve\Half-Life\Settings', 'ValveKey', 'AAAAA-AAAAA-AAAAA-AAAAA-AAAAA');
end;

Oasahelola
19-02-2016, 16:54
Мне нужно добавить много EXE-файлов создать для них ярлыки
Вопрос: Правильно ли я делаю ?

Сомневаюсь в правильности скрипта

P.S
Через мастер скриптов можно только один добавить


#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"

[Setup]
AppId={{BEC44BB3-44D5-412E-B193-EBDAB39F9CDE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\TEST\EXE1.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\TEST\EXE2.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\TEST\EXE3.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\TEST\EXE4.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\TEST\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\EXE1.exe"
Name: "{group}\{#MyAppName}"; Filename: "{app}\EXE2.exe"
Name: "{group}\{#MyAppName}"; Filename: "{app}\EXE3.exe"
Name: "{group}\{#MyAppName}"; Filename: "{app}\EXE4.exe"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\EXE1"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\EXE2"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\EXE3"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\EXE4"; Tasks: desktopicon

Dodakaedr
19-02-2016, 17:39
Oasahelola, почти, пишите разные имена ярлыков

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\EXE1.exe"
Name: "{group}\{#MyAppName}2"; Filename: "{app}\EXE2.exe"
Name: "{group}\{#MyAppName}3"; Filename: "{app}\EXE3.exe"
Name: "{group}\{#MyAppName}4"; Filename: "{app}\EXE4.exe"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\EXE1"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}2"; Filename: "{app}\EXE2"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}3"; Filename: "{app}\EXE3"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName}4"; Filename: "{app}\EXE4"; Tasks: desktopicon

ZVSRus
19-02-2016, 18:59
Требуется помощь.

Source: "{app}\msimg32.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: ignoreversion sharedfile uninsnosharedfileprompt
Данная DLL'ка добавлена в дистрибутив для регистрации. DLL'ка с таким-же именем есть в System32/
При удалении программы dll'ка не удаляется. Решение найдено такое.

[UninstallDelete]
Type: files; Name: "{app}\msimg32.dll";

Procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if (CurUninstallStep = usPostUninstall) then
UnloadDLL(ExpandConstant('{app}\msimg32.dll'));
DeleteFile(ExpandConstant('{app}\msimg32.dll'));
// MoveDir(ExpandConstant('{app}\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}'));
DelTree(ExpandConstant('{app}'), True, True, True);
RemoveDir(ExpandConstant('{pf}\ObviousIdea'));

После данной процедуры все удаляется в чистую, но сообщение Деинсталляция %1 завершена.%n%nЧасть элементов не удалось удалить. Вы можете удалить их самостоятельно. как было так и осталось, хотя нигде ничего нету.
Решение нашёл такое.

[Messages]
UninstalledMost=Программа %1 была полностью удалена с вашего компьютера.

Думаю что данное решение не совсем правильное.
В связи с тем что в System32 есть DLL'ка с таким -же именем что и для регистрации, думаю что деинсталлятор реагирует на нее и по этому выдаёт сообщение что не все удалилось.
Думаю к строке Source: нужно добавить какие то флаги, чтобы деинсталлятор не реагировал на системную DLL msimg32.dll.
Помогите решить данную проблему.

El Sanchez
19-02-2016, 20:08
Нашёл вроде бы неплохой код для проверки на наличие определённого обновления Windows https://theroadtodelphi.wordpress.co...i-wmi-and-wua/ »
Raf-9600, он плох тем, что, во-первых, долго выполняется метод Search, на моей Windows 7 x64 ~15 мин, на XP ~2 мин, во-вторых, сравнивать параметр функции со свойством Title не есть хорошо, нужно использовать KBArticleIDs.

//////////////////////////////////////////////////////////////
function IsHotFixIDInstalled(const HotFixID: string): Boolean;
var
UpdateSession, UpdateSearcher, UpdateSearchResult,
UpdateCollection, UpdateItem: Variant;
i, j, UpdatesCount: Integer;
begin
Result := False;
UpdateSession := CreateOleObject('Microsoft.Update.Session');
UpdateSearcher := UpdateSession.CreateUpdateSearcher;
UpdateSearcher.Online := False;
UpdateSearchResult := UpdateSearcher.Search('IsInstalled = 1 and Type=''Software''');
UpdateCollection := UpdateSearchResult.Updates;
UpdatesCount := StrToIntDef(UpdateCollection.Count, 0);
for i := 0 to UpdatesCount - 1 do
begin
UpdateItem := UpdateCollection.Item[i];
for j := 0 to UpdateItem.KBArticleIDs.Count - 1 do
begin
Result := (CompareText(string(UpdateItem.KBArticleIDs.Item[j]), HotFixID) = 0);
if Result then Exit;
end;
end;
end;

///////////////////////////
procedure InitializeWizard;
begin
if IsHotFixIDInstalled('2483139') then
MsgBox('yes', mbInformation, MB_OK);
end;


Source: "{app}\msimg32.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: ignoreversion sharedfile uninsnosharedfileprompt
Данная DLL'ка добавлена в дистрибутив для регистрации. DLL'ка с таким-же именем есть в System32/ »
ZVSRus, ну и зачем ее [msimg32.dll] копия в {app}? Или не копия? И зачем заводить еще и счетчик ссылок?

ZVSRus
19-02-2016, 20:35
ну и зачем ее [msimg32.dll] копия в {app}? Или не копия?
Нет эта DLL (msimg32.dll) не копия, идет в архиве с программой для регистрации.
(Поместить файл из раздачи msimg32.dll в папку с установленной программой.)

vadjliss
21-02-2016, 11:24
ребята если у меня не сколько вот таких секций то как их объединить?
procedure CurPageChanged(CurPageID: Integer)

а, то выдаёт ошибку
http://fs5.directupload.net/images/160221/temp/zkdrf5x7.jpg (http://fs5.directupload.net/images/160221/zkdrf5x7.jpg)

kotyarko@fb
21-02-2016, 12:28
vadjliss, Procedure CurPageChanged1(CurPageID: Integer);
begin
...
end;

Procedure CurPageChanged2(CurPageID: Integer);
begin
...
end;

Procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;

nik1967
21-02-2016, 20:07
vadjliss, а лучше всё в одной процедуре объединить. Чтобы путаницы не было.

saurn
21-02-2016, 20:09
ребята если у меня не сколько вот таких секций то как их объединить?
procedure CurPageChanged(CurPageID: Integer) »
Выполнять все задачи в блоке одной процедуры. Так будет намного удобней, и в плане читаемости кода особенно.
procedure CurPageChanged( CurPageID: Integer );
begin
задача 1
задача 2
end;

procedure CurPageChanged( CurPageID: Integer );
begin
задача 3
задача 4
end;

procedure CurPageChanged( CurPageID: Integer );
begin
задача 1
задача 2
задача 3
задача 4
end;

Ой, nik1967 уже пояснил. Ну да ладно.)

Карась з Днiпра
24-02-2016, 16:25
Добрый день. Подскажите пожалуйста, какие команды нужно дописать в скрипт, чтобы в случае если в директории установки программы будет найден файл с определенным именем, он будет удален автоматически. И еще одна проблемка. Если знаете, помогите плис. Столкнулся с тем, что Win10 блокирует инсталлятор. Тут я вообще безсилен, так как никогда не работал с этой ОС.

Gamattinol
24-02-2016, 17:03
134345Как сделать такой компонент ?

ZVSRus
24-02-2016, 18:20
Как сделать такой компонент ?


[Setup]
AppName=Notepad
AppVersion=1.5
DefaultDirName={pf}\Notepad

[Code*]
var
NewGroupBox: TNewGroupBox;

procedure InitializeWizard();
begin
NewGroupBox := TNewGroupBox.Create(WizardForm);
with NewGroupBox do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(100);
Width := ScaleX(417);
Height := ScaleY(60);
Caption := 'Папка установки:';
end;

NewGroupBox.TabOrder := 5;

with WizardForm.DirBrowseButton do
begin
Left := ScaleX(334);
Top := ScaleY(23);
Parent := NewGroupBox;
end;

with WizardForm.DirEdit do
begin
Left := ScaleX(8);
Top := ScaleY(24);
Width := ScaleX(320);
Parent := NewGroupBox;
end;
end;




© OSzone.net 2001-2012