LenovoLegionToolkit
202 строки · 6.1 Кб
1#define DotNetPrettyName "Microsoft .NET Desktop Runtime"
2#define DotNetName "Microsoft.WindowsDesktop.App 6"
3#define DotNetVersion "6.0.24"
4#define DotNetURL "https://download.visualstudio.microsoft.com/download/pr/dde9eb7e-8ea8-494a-9b04-5db26c7740e2/43d5050cfa63b7323749c7e56fedd3ac/windowsdesktop-runtime-6.0.24-win-x64.exe"
5#define DotNetExeName "dotnet6.exe"
6#define DotNetExeArgs "/install /repair /passive /norestart"
7
8[Code]
9var
10NeedsInstall: Boolean;
11Dependency_DownloadPage: TDownloadWizardPage;
12Dependency_Memo: String;
13
14function SplitString(Text: String; Separator: String): TArrayOfString;
15var
16i, p: Integer;
17dest: TArrayOfString;
18begin
19i := 0;
20repeat
21SetArrayLength(dest, i + 1);
22p := Pos(Separator, Text);
23if p > 0 then begin
24dest[i] := Copy(Text, 1, p - 1);
25Text := Copy(Text, p + Length(Separator), Length(Text));
26i := i + 1;
27end else begin
28dest[i] := Text;
29Text := '';
30end;
31until Length(Text)=0;
32Result := dest
33end;
34
35function CheckDotNetVersionEqualOrHigher(StringArray: TArrayOfString; DotNetName: String; MinimumVersionString: String): Boolean;
36var
37i, p: Integer;
38str, verStr: String;
39strArray: TArrayOfString;
40minVer, ver: Int64;
41begin
42Result := False;
43if StrToVersion(MinimumVersionString, minVer) then begin
44for i := 0 to GetArrayLength(StringArray) - 1 do begin
45str := StringArray[i];
46p := Pos(DotNetName, str);
47if p > 0 then begin
48strArray := SplitString(str, ' ');
49if GetArrayLength(strArray) >= 3 then begin
50verStr := strArray[1];
51if StrToVersion(verStr, ver) then begin
52if ComparePackedVersion(minVer, ver) <= 0 then begin
53Result := True;
54break;
55end;
56end;
57end;
58end;
59end;
60end;
61end;
62
63function IsDotNetInstalled(DotNetName: string; DotNetVersion: string): Boolean;
64var
65cmd, args, fileName, command: string;
66output: AnsiString;
67resultCode: Integer;
68begin
69command := 'dotnet --list-runtimes';
70fileName := ExpandConstant('{tmp}\dotnet.txt');
71cmd := ExpandConstant('{cmd}');
72args := '/C ' + command + ' > "' + fileName + '" 2>&1';
73
74if Exec(cmd, args, '', SW_HIDE, ewWaitUntilTerminated, resultCode) and (resultCode = 0) then begin
75if LoadStringFromFile(fileName, output) then begin
76if CheckDotNetVersionEqualOrHigher(SplitString(output, #13#10), DotNetName, DotNetVersion) then begin
77Log('"' + DotNetName + '" version "' + DotNetVersion + '" or higher found in output of "' + command + '"');
78Result := True;
79end
80else begin
81Log('"' + DotNetName + '" version "' + DotNetVersion + '" or higher not found in output of "' + command + '"');
82Result := False;
83end;
84end
85else begin
86Log('Failed to read output of "' + command + '"');
87Result := False;
88end;
89end
90else begin
91Log('Failed to execute "' + command + '"');
92Result := False;
93end;
94
95DeleteFile(fileName);
96end;
97
98procedure InstallDotNet6DesktopRuntime;
99begin
100if not IsDotNetInstalled('{#DotNetName}', '{#DotNetVersion}') then begin
101NeedsInstall := True;
102Dependency_Memo := Dependency_Memo + #13#10 + '%1' + '{#DotNetPrettyName} {#DotNetVersion}';
103end;
104end;
105
106<event('InitializeWizard')>
107procedure Dependency_InitializeWizard;
108begin
109Dependency_DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
110end;
111
112<event('UpdateReadyMemo')>
113function Dependency_UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
114begin
115Result := '';
116if MemoUserInfoInfo <> '' then begin
117Result := Result + MemoUserInfoInfo + Newline + NewLine;
118end;
119if MemoDirInfo <> '' then begin
120Result := Result + MemoDirInfo + Newline + NewLine;
121end;
122if MemoTypeInfo <> '' then begin
123Result := Result + MemoTypeInfo + Newline + NewLine;
124end;
125if MemoComponentsInfo <> '' then begin
126Result := Result + MemoComponentsInfo + Newline + NewLine;
127end;
128if MemoGroupInfo <> '' then begin
129Result := Result + MemoGroupInfo + Newline + NewLine;
130end;
131if MemoTasksInfo <> '' then begin
132Result := Result + MemoTasksInfo;
133end;
134if Dependency_Memo <> '' then begin
135if MemoTasksInfo = '' then begin
136Result := Result + SetupMessage(msgReadyMemoTasks);
137end;
138Result := Result + FmtMessage(Dependency_Memo, [Space]);
139end;
140end;
141
142<event('PrepareToInstall')>
143function Dependency_PrepareToInstall(var NeedsRestart: Boolean): String;
144var
145prettyName: String;
146retry, abort: Boolean;
147resultCode: Integer;
148begin
149if NeedsInstall then begin
150prettyName := '{#DotNetPrettyName} {#DotNetVersion}'
151
152Dependency_DownloadPage.Show;
153Dependency_DownloadPage.Clear;
154Dependency_DownloadPage.Add('{#DotNetURL}', '{#DotNetExeName}', '');
155
156retry := True;
157while retry do begin
158retry := False;
159abort := False;
160
161try
162Dependency_DownloadPage.Download;
163except
164if Dependency_DownloadPage.AbortedByUser then begin
165abort := True
166end else begin
167case SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbError, MB_RETRYCANCEL, IDRETRY) of
168IDCANCEL: begin
169abort := True;
170end;
171IDRETRY: begin
172retry := True;
173end;
174end;
175end;
176end;
177end;
178
179if not abort then begin
180Dependency_DownloadPage.SetText(prettyName, '');
181Dependency_DownloadPage.SetProgress(1, 1);
182
183while True do begin
184resultCode := 0;
185if ShellExec('', ExpandConstant('{tmp}{\}') + '{#DotNetExeName}', '{#DotNetExeArgs}', '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultCode) then begin
186if (resultCode = 0) then begin
187break;
188end;
189end;
190
191case SuppressibleMsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [prettyName, IntToStr(ResultCode)]), mbError, MB_RETRYCANCEL, IDRETRY) of
192IDCANCEL: begin
193abort := True;
194break;
195end;
196end;
197end;
198end;
199
200Dependency_DownloadPage.Hide;
201end;
202end;
203