LenovoLegionToolkit

Форк
0
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]
9
var
10
  NeedsInstall: Boolean;
11
  Dependency_DownloadPage: TDownloadWizardPage;
12
  Dependency_Memo: String;
13

14
function SplitString(Text: String; Separator: String): TArrayOfString;
15
var
16
  i, p: Integer;
17
  dest: TArrayOfString; 
18
begin
19
  i := 0;
20
  repeat
21
    SetArrayLength(dest, i + 1);
22
    p := Pos(Separator, Text);
23
    if p > 0 then begin
24
      dest[i] := Copy(Text, 1, p - 1);
25
      Text := Copy(Text, p + Length(Separator), Length(Text));
26
      i := i + 1;         
27
    end else begin
28
      dest[i] := Text;
29
      Text := '';
30
    end;
31
  until Length(Text)=0;
32
  Result := dest
33
end;
34

35
function CheckDotNetVersionEqualOrHigher(StringArray: TArrayOfString; DotNetName: String; MinimumVersionString: String): Boolean;
36
var
37
  i, p: Integer;
38
  str, verStr: String;
39
  strArray: TArrayOfString;
40
  minVer, ver: Int64;
41
begin       
42
  Result := False;
43
  if StrToVersion(MinimumVersionString, minVer) then begin
44
    for i := 0 to GetArrayLength(StringArray) - 1 do begin
45
      str := StringArray[i];
46
      p := Pos(DotNetName, str);
47
      if p > 0 then begin
48
        strArray := SplitString(str, ' ');
49
        if GetArrayLength(strArray) >= 3 then begin
50
          verStr := strArray[1]; 
51
          if StrToVersion(verStr, ver) then begin
52
            if ComparePackedVersion(minVer, ver) <= 0 then begin
53
              Result := True;
54
              break;
55
            end;
56
          end;
57
        end;
58
      end;
59
    end;
60
  end;
61
end;
62

63
function IsDotNetInstalled(DotNetName: string; DotNetVersion: string): Boolean;
64
var
65
  cmd, args, fileName, command: string;
66
  output: AnsiString;
67
  resultCode: Integer;
68
begin  
69
  command := 'dotnet --list-runtimes';
70
  fileName := ExpandConstant('{tmp}\dotnet.txt');
71
  cmd := ExpandConstant('{cmd}');
72
  args := '/C ' + command + ' > "' + fileName + '" 2>&1';
73

74
  if Exec(cmd, args, '', SW_HIDE, ewWaitUntilTerminated, resultCode) and (resultCode = 0) then begin
75
    if LoadStringFromFile(fileName, output) then begin
76
      if CheckDotNetVersionEqualOrHigher(SplitString(output, #13#10), DotNetName, DotNetVersion) then begin
77
        Log('"' + DotNetName + '" version "' + DotNetVersion + '" or higher found in output of "' + command + '"');
78
        Result := True;
79
      end
80
      else begin
81
        Log('"' + DotNetName + '" version "' + DotNetVersion + '" or higher not found in output of "' + command + '"');
82
        Result := False;
83
      end;
84
    end
85
    else begin
86
      Log('Failed to read output of "' + command + '"');
87
      Result := False;
88
    end;
89
  end
90
  else begin
91
    Log('Failed to execute "' + command + '"');
92
    Result := False;
93
  end;
94
 
95
  DeleteFile(fileName);
96
end;
97

98
procedure InstallDotNet6DesktopRuntime;
99
begin
100
  if not IsDotNetInstalled('{#DotNetName}', '{#DotNetVersion}') then begin 
101
    NeedsInstall := True;
102
    Dependency_Memo := Dependency_Memo + #13#10 + '%1' + '{#DotNetPrettyName} {#DotNetVersion}';
103
  end;
104
end;
105

106
<event('InitializeWizard')>
107
procedure Dependency_InitializeWizard;
108
begin
109
  Dependency_DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
110
end;
111

112
<event('UpdateReadyMemo')>
113
function Dependency_UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
114
begin
115
  Result := '';
116
  if MemoUserInfoInfo <> '' then begin
117
    Result := Result + MemoUserInfoInfo + Newline + NewLine;
118
  end;
119
  if MemoDirInfo <> '' then begin
120
    Result := Result + MemoDirInfo + Newline + NewLine;
121
  end;
122
  if MemoTypeInfo <> '' then begin
123
    Result := Result + MemoTypeInfo + Newline + NewLine;
124
  end;
125
  if MemoComponentsInfo <> '' then begin
126
    Result := Result + MemoComponentsInfo + Newline + NewLine;
127
  end;
128
  if MemoGroupInfo <> '' then begin
129
    Result := Result + MemoGroupInfo + Newline + NewLine;
130
  end;
131
  if MemoTasksInfo <> '' then begin
132
    Result := Result + MemoTasksInfo;
133
  end;
134
  if Dependency_Memo <> '' then begin
135
    if MemoTasksInfo = '' then begin
136
      Result := Result + SetupMessage(msgReadyMemoTasks);
137
    end;
138
    Result := Result + FmtMessage(Dependency_Memo, [Space]);
139
  end;
140
end;
141

142
<event('PrepareToInstall')>
143
function Dependency_PrepareToInstall(var NeedsRestart: Boolean): String;
144
var
145
  prettyName: String;
146
  retry, abort: Boolean;
147
  resultCode: Integer;
148
begin
149
  if NeedsInstall then begin
150
    prettyName := '{#DotNetPrettyName} {#DotNetVersion}'
151

152
    Dependency_DownloadPage.Show;
153
    Dependency_DownloadPage.Clear;
154
    Dependency_DownloadPage.Add('{#DotNetURL}', '{#DotNetExeName}', '');
155

156
    retry := True;
157
    while retry do begin
158
      retry := False;
159
      abort := False;
160

161
      try
162
        Dependency_DownloadPage.Download;
163
      except
164
        if Dependency_DownloadPage.AbortedByUser then begin
165
          abort := True
166
          end else begin
167
          case SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbError, MB_RETRYCANCEL, IDRETRY) of
168
            IDCANCEL: begin
169
              abort := True;
170
            end;
171
            IDRETRY: begin
172
              retry := True;
173
            end;
174
          end;
175
        end;
176
      end;
177
    end;
178

179
    if not abort then begin
180
      Dependency_DownloadPage.SetText(prettyName, '');
181
      Dependency_DownloadPage.SetProgress(1, 1);
182

183
      while True do begin
184
          resultCode := 0;
185
          if ShellExec('', ExpandConstant('{tmp}{\}') + '{#DotNetExeName}', '{#DotNetExeArgs}', '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultCode) then begin
186
            if (resultCode = 0) then begin
187
              break;
188
            end;
189
          end;
190

191
          case SuppressibleMsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [prettyName, IntToStr(ResultCode)]), mbError, MB_RETRYCANCEL, IDRETRY) of
192
            IDCANCEL: begin
193
              abort := True;
194
              break;
195
            end;
196
          end;
197
        end;
198
    end;
199

200
    Dependency_DownloadPage.Hide;
201
  end;
202
end;
203

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.