Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО / 25 сообщений из 31, страница 1 из 2
09.08.2019, 18:45
    #39847654
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
У каждого, конечно, свой способ это делать, но вот как сделал я (обновление не из интернета, а из сетевого диска. Из интернета есть у ErrorSoft, код которого для TFileVersion тут используется

вызов
Код: pascal
1.
   CheckUpdate(TFileVersion.CreateForFile(ParamStr(0)), cbSilentUpdate.Checked);



сам код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TfrmEnforce.CheckUpdate(Version: TFileVersion; Silent : boolean = true);
var
  fn, RemoteFn : string; RemoteVersion : TFileVersion;
begin
  fn := ExtractFileName (Application.ExeName);
//  fp := ExtractFilePath (Application.ExeName);
  RemoteFn := lbeSelfUpdateFolder.Text + '\'+ fn;
  if FileExists (RemoteFn) then begin
    RemoteVersion := TFileVersion.CreateForFile(RemoteFn);
    if Version < RemoteVersion then
      if Silent or (not (Silent) and (MessageBox(0, PChar('Update available. Update now?'), PChar(''), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes)) then begin
      if FileExists (Application.ExeName + '.old') then DeleteFile (Application.ExeName + '.old');
      RenameFile (Application.ExeName, Application.ExeName + '.old');
      FileCopy (RemoteFn,Application.ExeName, true);
//       fp+'\' + fn, true);
      OpenExternalProcess(Application.ExeName);
      Halt(0);
    end;
  end
  else begin
    MessageDlg('Update file '+RemoteFn+' not exists', mtError, [mbOK], 0);
    lbeSelfUpdateFolder.Show;
  end;
end;



Используется код выдранный из ErrorSoft Update (спасибо):

Код: pascal
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.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
unit FileVersion;

interface

uses System.SysUtils;

type
  TFileVersion = record
  public
    Major: Word;
    Minor: Word;
    Release: Word;
    Build: Word;
    //
    class operator Equal(L, R: TFileVersion): Boolean;// =
    class operator NotEqual(L, R: TFileVersion): Boolean;//	<>
    class operator GreaterThan(L, R: TFileVersion): Boolean;// >
    class operator GreaterThanOrEqual(L, R: TFileVersion): Boolean;// >=
    class operator LessThan(L, R: TFileVersion): Boolean;// <
    class operator LessThanOrEqual(L, R: TFileVersion): Boolean;// <=
    //
    constructor Create(VersionStr: string);
    {$IFDEF MSWINDOWS}
    constructor CreateForFile(FileName: TFileName);
    {$ENDIF}
    function ToString: string;
  end;


{$IFDEF MSWINDOWS}
function GetFileVersion(FileName: string; out Version: TFileVersion): Boolean;
{$ENDIF}

implementation

{$IFDEF MSWINDOWS}
uses
  WinApi.Windows;
{$ENDIF}

{$IFDEF MSWINDOWS}
function GetFileVersion(FileName: string; out Version: TFileVersion): Boolean;
var
  InfoSize, Wnd: DWORD;
  VerBuf: Pointer;
  FI: PVSFixedFileInfo;
  VerSize: DWORD;
begin
  Result := False;
  UniqueString(FileName);
  InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  if InfoSize <> 0 then
  begin
    GetMem(VerBuf, InfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
        if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
        begin
          Version.Major := HiWord(FI.dwFileVersionMS);
          Version.Minor := LoWord(FI.dwFileVersionMS);
          Version.Release := HiWord(FI.dwFileVersionLS);
          Version.Build := LoWord(FI.dwFileVersionLS);
          Result := True;
        end;
    finally
      FreeMem(VerBuf);
    end;
  end;
end;
{$ENDIF}

{ TFileVersion }

constructor TFileVersion.Create(VersionStr: string);
var
  A: TArray<string>;
begin
  Major := 0;
  Minor := 0;
  Release := 0;
  Build := 0;
  A := VersionStr.Split(['.']);

  try
    if High(A) >= 0 then
      Major := A[0].Trim.ToInteger;
    if High(A) >= 1 then
      Minor := A[1].Trim.ToInteger;
    if High(A) >= 2 then
      Release := A[2].Trim.ToInteger;
    if High(A) >= 3 then
      Build := A[3].Trim.ToInteger;
  except
    on EConvertError do ;
  end;
end;

{$IFDEF MSWINDOWS}
constructor TFileVersion.CreateForFile(FileName: TFileName);
begin
  Self := Default(TFileVersion);
  GetFileVersion(FileName, Self);
end;
{$ENDIF}

class operator TFileVersion.Equal(L, R: TFileVersion): Boolean;
begin
  Result := (L.Major = R.Major) and (L.Minor = R.Minor) and (L.Release = R.Release) and (L.Build = R.Build);
end;

class operator TFileVersion.GreaterThan(L, R: TFileVersion): Boolean;
begin
  Result := R < L;
end;

class operator TFileVersion.GreaterThanOrEqual(L, R: TFileVersion): Boolean;
begin
  Result := R <= L;
end;

class operator TFileVersion.LessThan(L, R: TFileVersion): Boolean;
begin
  Result := False;

  // Major
  if L.Major > R.Major then Exit(False);
  if L.Major < R.Major then Exit(True);

  // Minor
  if L.Minor > R.Minor then Exit(False);
  if L.Minor < R.Minor then Exit(True);

  // Release
  if L.Release > R.Release then Exit(False);
  if L.Release < R.Release then Exit(True);

  // Build
  if L.Build > R.Build then Exit(False);
  if L.Build < R.Build then Exit(True);
end;

class operator TFileVersion.LessThanOrEqual(L, R: TFileVersion): Boolean;
begin
  Result := (L < R) or (L = R);
end;

class operator TFileVersion.NotEqual(L, R: TFileVersion): Boolean;
begin
  Result := not (L = R);
end;

function TFileVersion.ToString: string;
begin
  Result := Format('%d.%d.%d.%d', [Major, Minor, Release, Build]);
end;

end.


и
OpenExternalProcess отсюда: 18967332
Спасибо JaDi и GunSmoker

Теперь НО.
А оно вот в чём - после завершения работы программы, скаченной с диска, удалить этот файл нельзя никак (можно переименовать, но вот удалить - фиг):

Код: plaintext
1.
Can not delete the file D:\blablabla\Win32\Debug\Info.lll' Objecy is being open in Unknown (PID: 0) Access is denied
...
Рейтинг: 0 / 0
09.08.2019, 18:48
    #39847655
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
09.08.2019 18:45, Victor Cookin пишет:
> Can not delete the file

какая ОСь и какие антивирусы?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2019, 18:49
    #39847656
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Мимопроходящий,

Windows 7 Pro, McAfee
...
Рейтинг: 0 / 0
09.08.2019, 18:51
    #39847658
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Мимопроходящий,

С этим сетевым диском вообще чудеса - если пытаешься с него стартовать программу, то DOA не находит TNSNAMES. Хотя казалось бы -какая разница откуда прога загружена.
...
Рейтинг: 0 / 0
09.08.2019, 18:51
    #39847659
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
09.08.2019 18:49, Victor Cookin пишет:
> Windows 7 Pro, McAfee

проверь на "чистой" железяке, без антивируса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2019, 19:02
    #39847667
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
При этом если загрузка новой версии с локального диска - всё нормально удаляется
...
Рейтинг: 0 / 0
09.08.2019, 19:11
    #39847670
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor Cookin> удалить этот файл нельзя никак
Victor Cookin> Can not delete the file
Victor Cookin> Objecy is being open in Unknown (PID: 0) Access is denied

А что показывает Find Handler (кто его удерживает) ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2019, 19:22
    #39847672
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Можно поставить anvir task manager и посмотреть кто удерживает
...
Рейтинг: 0 / 0
09.08.2019, 19:28
    #39847674
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Гаджимурадов Рустам,

Файл прекрасно открывается, но сохраняться отказывается. Говорит:
Can't open file: The requested operation cannot be performed on a file with a user-mapped section open
...
Рейтинг: 0 / 0
09.08.2019, 19:29
    #39847675
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
X-Cite,

anvir task manage не даст поставить антивирус, я уверен
...
Рейтинг: 0 / 0
09.08.2019, 19:30
    #39847676
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Мимопроходящийкакая ОСь и какие антивирусы?а причем тут это? Он пытается перезаписать запущенную программу новым файлом. Всё нормально
...
Рейтинг: 0 / 0
09.08.2019, 19:38
    #39847680
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Ghost Writer,

я запущенную программу переименовываю перед тем как на её место скопировать новую и перезаписать. И всё прекрасно работает. Единственно - если программа скачивалась с сетевого диска, то фиг её потом удалишь.
...
Рейтинг: 0 / 0
09.08.2019, 19:47
    #39847681
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Мимопроходящийпроверь на "чистой" железяке, без антивируса.


Проверил - на чистой (Win10 Personal без антивируса или с Microsoft Defender /или как его сейчас зовут/) всё пучком - обновляется, удаляется.
...
Рейтинг: 0 / 0
09.08.2019, 19:53
    #39847683
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor CookinИ всё прекрасно работает.пока Version >= RemoteVersion. да ?
...
Рейтинг: 0 / 0
09.08.2019, 20:02
    #39847685
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Ghost WriterVictor CookinИ всё прекрасно работает.пока Version >= RemoteVersion. да ?

Тоже работает, но не обновляется. Когда Version < RemoteVersion, то обновляется и работает.

Единственная проблема :
Если
1) Version < RemoteVersion
2) и в качестве фолдера обновления задан сетевой фолдер (а другой и смысла нет задавать)
3) и работает McAfee ( а он работает во всей организации)

То после завершения работы файл хрен удалишь. А значит, что через несколько обновлений обновления перестанут работать. Нужно будет просить юсера перезагрузить комп, а не хочется.
...
Рейтинг: 0 / 0
09.08.2019, 20:07
    #39847686
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor Cookin3) и работает McAfee ( а он работает во всей организации)

Соболезную. Самый кривой из "больших" антивирусов, который мне известен.
...
Рейтинг: 0 / 0
09.08.2019, 20:09
    #39847688
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor CookinX-Cite,

anvir task manage не даст поставить антивирус, я уверен
Дома отлично уживается с Касперским, а на работе с Симантеком
...
Рейтинг: 0 / 0
09.08.2019, 20:10
    #39847689
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor Cookinanvir task manage не даст поставить антивирус, я уверен
его не обязательно ставить - есть портабельная сборка в виде архива
...
Рейтинг: 0 / 0
09.08.2019, 20:10
    #39847690
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Victor CookinТо после завершения работы файл хрен удалишь.удаляет новая версия программы при запуске ? а ручками тоже не дает ?
...
Рейтинг: 0 / 0
09.08.2019, 20:26
    #39847693
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Докего не обязательно ставить - есть портабельная сборка в виде архива

Спасибо, но он у меня встал, McAfee даже не ругнулся. AVG раньше ругался на ANVIR
...
Рейтинг: 0 / 0
09.08.2019, 20:30
    #39847695
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
Ghost Writer,

Всё же есть в коде.
Апдейтер удаляет app.exe.old, если таковое имеется
Затем переименовывает app.exe в app.exe.old
Потом копирует app.exe из update фолдера в рабочий фолдер.
Ручками тоже не удаляется.

Пришлось
Код: pascal
1.
2.
3.
    except
      MessageDlg('Ошибка автообновления. Пожалуйста, перезагрузите компьютер и программа попробует обновиться ещё раз.', mtWarning, [mbOK], 0);
    end;
...
Рейтинг: 0 / 0
09.08.2019, 20:32
    #39847696
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
X-CiteМожно поставить anvir task manager и посмотреть кто удерживает

ANVIR не показывает это файлы как залоченные.
...
Рейтинг: 0 / 0
09.08.2019, 20:42
    #39847697
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
т.е. если выбрать все процессы, то ни один не удерживает дескриптор файла?
...
Рейтинг: 0 / 0
09.08.2019, 20:50
    #39847699
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
X-Cite,

Нет. Но проблема отпала - такое поведение только если запускаешь из Дельфей, а если, например, из ФАРа, то всё нормально.
...
Рейтинг: 0 / 0
09.08.2019, 20:52
    #39847700
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
То есть не работает (лочит икзешники) в единственном случае :

1) Version < RemoteVersion
2) и в качестве фолдера обновления задан сетевой фолдер (а другой и смысла нет задавать)
3) и работает McAfee ( а он работает во всей организации)
4) прога запускается из Дельфей

Посему вопрос отпал. Бог его знает как McAfee и Дельфя взаимодействуют, пусть их.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]