Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
У каждого, конечно, свой способ это делать, но вот как сделал я (обновление не из интернета, а из сетевого диска. Из интернета есть у ErrorSoft, код которого для TFileVersion тут используется

вызов
   CheckUpdate(TFileVersion.CreateForFile(ParamStr(0)), cbSilentUpdate.Checked);


сам код
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 (спасибо):

+
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

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

Can not delete the file D:\blablabla\Win32\Debug\Info.lll' Objecy is being open in Unknown (PID: 0) Access is denied


Сообщение было отредактировано: 9 авг 19, 19:10
9 авг 19, 18:45    [21945875]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

09.08.2019 18:45, Victor Cookin пишет:
> Can not delete the file

какая ОСь и какие антивирусы?

Posted via ActualForum NNTP Server 1.5

9 авг 19, 18:48    [21945876]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Мимопроходящий,

Windows 7 Pro, McAfee
9 авг 19, 18:49    [21945877]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Мимопроходящий,

С этим сетевым диском вообще чудеса - если пытаешься с него стартовать программу, то DOA не находит TNSNAMES. Хотя казалось бы -какая разница откуда прога загружена.
9 авг 19, 18:51    [21945879]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

09.08.2019 18:49, Victor Cookin пишет:
> Windows 7 Pro, McAfee

проверь на "чистой" железяке, без антивируса.

Posted via ActualForum NNTP Server 1.5

9 авг 19, 18:51    [21945880]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
При этом если загрузка новой версии с локального диска - всё нормально удаляется
9 авг 19, 19:02    [21945890]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60294
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

9 авг 19, 19:11    [21945897]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1602
Можно поставить anvir task manager и посмотреть кто удерживает
9 авг 19, 19:22    [21945900]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Гаджимурадов Рустам,

Файл прекрасно открывается, но сохраняться отказывается. Говорит:
Can't open file: The requested operation cannot be performed on a file with a user-mapped section open
9 авг 19, 19:28    [21945902]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
X-Cite,

anvir task manage не даст поставить антивирус, я уверен
9 авг 19, 19:29    [21945903]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 845
Мимопроходящий
какая ОСь и какие антивирусы?
а причем тут это? Он пытается перезаписать запущенную программу новым файлом. Всё нормально Картинка с другого сайта.
9 авг 19, 19:30    [21945904]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Ghost Writer,

я запущенную программу переименовываю перед тем как на её место скопировать новую и перезаписать. И всё прекрасно работает. Единственно - если программа скачивалась с сетевого диска, то фиг её потом удалишь.
9 авг 19, 19:38    [21945908]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Мимопроходящий
проверь на "чистой" железяке, без антивируса.


Проверил - на чистой (Win10 Personal без антивируса или с Microsoft Defender /или как его сейчас зовут/) всё пучком - обновляется, удаляется.
9 авг 19, 19:47    [21945911]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 845
Victor Cookin
И всё прекрасно работает.
пока Version >= RemoteVersion. да ?
9 авг 19, 19:53    [21945915]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Ghost Writer
Victor Cookin
И всё прекрасно работает.
пока Version >= RemoteVersion. да ?


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

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

То после завершения работы файл хрен удалишь. А значит, что через несколько обновлений обновления перестанут работать. Нужно будет просить юсера перезагрузить комп, а не хочется.
9 авг 19, 20:02    [21945920]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Victor Cookin
3) и работает McAfee ( а он работает во всей организации)

Соболезную. Самый кривой из "больших" антивирусов, который мне известен.
9 авг 19, 20:07    [21945924]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1602
Victor Cookin
X-Cite,

anvir task manage не даст поставить антивирус, я уверен

Дома отлично уживается с Касперским, а на работе с Симантеком
9 авг 19, 20:09    [21945927]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Док
Member

Откуда: Казань
Сообщений: 6460
Victor Cookin
anvir task manage не даст поставить антивирус, я уверен

его не обязательно ставить - есть портабельная сборка в виде архива
9 авг 19, 20:10    [21945928]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Ghost Writer
Member

Откуда: Россия
Сообщений: 845
Victor Cookin
То после завершения работы файл хрен удалишь.
удаляет новая версия программы при запуске ? а ручками тоже не дает ?
9 авг 19, 20:10    [21945929]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Док
его не обязательно ставить - есть портабельная сборка в виде архива


Спасибо, но он у меня встал, McAfee даже не ругнулся. AVG раньше ругался на ANVIR
9 авг 19, 20:26    [21945937]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Ghost Writer,

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

Пришлось
    except
      MessageDlg('Ошибка автообновления. Пожалуйста, перезагрузите компьютер и программа попробует обновиться ещё раз.', mtWarning, [mbOK], 0);
    end;
9 авг 19, 20:30    [21945941]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
X-Cite
Можно поставить anvir task manager и посмотреть кто удерживает


ANVIR не показывает это файлы как залоченные.
9 авг 19, 20:32    [21945942]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1602
т.е. если выбрать все процессы, то ни один не удерживает дескриптор файла?
9 авг 19, 20:42    [21945945]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
X-Cite,

Нет. Но проблема отпала - такое поведение только если запускаешь из Дельфей, а если, например, из ФАРа, то всё нормально.
9 авг 19, 20:50    [21945950]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
То есть не работает (лочит икзешники) в единственном случае :

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

Посему вопрос отпал. Бог его знает как McAfee и Дельфя взаимодействуют, пусть их.
9 авг 19, 20:52    [21945951]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
DimaBr
Member

Откуда:
Сообщений: 11324
Victor Cookin
X-Cite,

Нет. Но проблема отпала - такое поведение только если запускаешь из Дельфей, а если, например, из ФАРа, то всё нормально.

Так Delphi и держит файл.
9 авг 19, 21:09    [21945957]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
DimaBr
Так Delphi и держит файл.


Логично. А что Дельфи локальный файл не держит - это баг?
10 авг 19, 00:39    [21946002]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Дельфи файд может держать по разным своим причинам. Напр., запуск, отладка...
А что покажет Unlocker?
10 авг 19, 11:37    [21946063]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Gator,

Ничего он не покажет, файлы разблокировались за выходные. Щас ещё соберу, обновлюсь, доложу.
12 авг 19, 21:22    [21947535]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Gator,

А сегодня ничего не блокируется, даже из Дельфей, даже с сетевого...
12 авг 19, 21:24    [21947537]     Ответить | Цитировать Сообщить модератору
 Re: Простой способ автообновления (AUTOUPDATE) ... и всё бы хорошо ... НО  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 714
Gator,

Спасибо за Unlocker. Правда, он никогда ничего не показал насчёт хозяина (Ну это было понятно, Windows ругался на попытки удалить/переименовать файл как "Access denied PID : 0")
Зато Unlocker и удаляет и переименовывает. Штатными средствами сие было недостижимо. Чёртов McAfee.
6 сен 19, 18:37    [21965598]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить