powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
25 сообщений из 31, страница 1 из 2
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847654
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У каждого, конечно, свой способ это делать, но вот как сделал я (обновление не из интернета, а из сетевого диска. Из интернета есть у 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
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847655
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.08.2019 18:45, Victor Cookin пишет:
> Can not delete the file

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

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

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

проверь на "чистой" железяке, без антивируса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847667
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом если загрузка новой версии с локального диска - всё нормально удаляется
...
Рейтинг: 0 / 0
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847670
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847672
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно поставить anvir task manager и посмотреть кто удерживает
...
Рейтинг: 0 / 0
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847674
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

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

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

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


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

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

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

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

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

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

Спасибо, но он у меня встал, McAfee даже не ругнулся. AVG раньше ругался на ANVIR
...
Рейтинг: 0 / 0
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847695
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО
    #39847696
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteМожно поставить anvir task manager и посмотреть кто удерживает

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

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

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

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


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