Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взять правильную версию переименованого EXE-файла? [D7, WinXP]


Семен Сорокин ©   (2005-10-21 17:04:00) 

Приветствую!
Ситуация следующая: есть запущенный exe (для примера test.exe) (система WinXP), версия файла 2.3.1.958, мне надо сделать обновление файла, я переименовываю test.exe в test_.exe - он оставется работать.
скидываю новую версию (2.3.1.959) test.exe.

В программе есть проверка версии, вот код, выполняющий проверку версии по таймеру:

procedure TfmMain.tmrCheckUpdateTimer(Sender: TObject);

function GetVersion(const Name: String): string;
type
  PVerLang = ^TVerLang;
  TVerLang = packed record
    Charset : Word;
    LangID  : Word;
  end;
var
    VerInfoSize : DWord;
    dummy       : DWord;
    VerInfo : Pointer;
    VSFixed : PVSFixedFileInfo;
    VSFixedSize : DWORD;
    VTranslation : PVerLang;
    VTRSize : DWORD;
    LangID : String;
    VerKey : String;
    VerDesc : PChar;
    VerDescSize : DWORD;
    Status : LongBool;
begin
 Result := EmptyStr;
 VerInfoSize := GetFileVersionInfoSize(PChar(Name), dummy);
 if (VerInfoSize = 0) then
   Exit;
 GetMem(VerInfo, VerInfoSize);
 try
   Status := GetFileVersionInfo(PChar(Name), 0, VerInfoSize, VerInfo);
   if NOT Status then
     Exit;
   VerQueryValue( VerInfo, '\', Pointer(VSFixed), VSFixedSize);
   VerQueryValue( VerInfo, '\VarFileInfo\Translation', Pointer(VTranslation), VTRSize);
   if (VTRSize = 4) then begin
     LangID := Format('%.4x%.4x', [VTranslation^.CharSet, VTranslation^.LangID]);
     VerKey := '\StringFileInfo\'+LangID+'\FileVersion';//Description';
     Status := VerQueryValue (VerInfo,PChar(VerKey), Pointer(VerDesc), VerDescSize);
     if (Status) AND (VerDescSize <> 0) then
       Result := VerDesc
   end;
 finally
   FreeMem(VerInfo, VerInfoSize);
 end;
end;
var
 _ver: string;
 _res: integer;
begin
if not FCheckVersion then
 Exit;
_ver := GetVersion(GlobalData.FileName);
if (_ver <> EmptyStr) and (_ver <> GlobalData.Version) then begin
 _res := MessageDlg('Обнаружена новая версия программы: ' + _ver + '!'#13#10'Перезапустить программу?', mtConfirmation, [mbYes, mbNo], 0);
 if _res = mrYes then begin
  Close;
  ShellExecute(0, 'open', PAnsiChar(GlobalData.FileName), nil, PAnsiChar(ExtractFilePath(GlobalData.FileName)), SW_SHOWNORMAL)
 end
 else
  FCheckVersion := false
end;
end;


GlobalData.FileName - при запуске заполняется ParamStr(0);
GlobalData.Version - соответственно версией

только вот что-то после переименовывания в _test.exe и добавления нового test.exe данный код вытягивает старую версию 2.3.1.958, хотя, ИМХО, должен брать новую - 2.3.1.959.

Где собака порылась? :-) кто подскажет?


Семен Сорокин   (2005-10-21 17:54:00) [1]


> umbra ©   (21.10.05 17:45) [8]
> нет, что в эксплорере будет видно новое имя - вполне возможно,
>  возражений нет. Но ntfs - журналируемая файловая система,
>  и реальные изменения могут быть отложены на будущее, когда
> они будут возможны

хммм, наверное так и есть


> clickmaker ©   (21.10.05 17:48) [9]

придумал похожий механизм, просто наряду с этим проверять другое файло на шаре, тот же текстовик с последней версией файла.


clickmaker   (2005-10-21 17:48:00) [2]

я бы сделал так
ты скидываешь свежак в шару
пишешь что-то типа лончера, в котором сравниваешь локальную и сервачную версии, если свежая - качаешь, запускаешь экзешник.
Для тех, кто сидит безвылазно, можно оставить таймер, но просто напоминать при наличии свежей версии, что мол она появилась, и если вы хотите обновицца, перезапускайтесь


umbra   (2005-10-21 17:45:00) [3]

нет, что в эксплорере будет видно новое имя - вполне возможно, возражений нет. Но ntfs - журналируемая файловая система, и реальные изменения могут быть отложены на будущее, когда они будут возможны


Семен Сорокин   (2005-10-21 17:37:00) [4]


> BiN ©   (21.10.05 17:34) [5]
> Вместо GlobalData.FileName  'test.exe' подставлял?

явно нет, но отладчиком проходил - показывает не переименованный...


Семен Сорокин   (2005-10-21 17:36:00) [5]


> clickmaker ©   (21.10.05 17:29) [3]
> а, ну да...
> а зачем вовще такие сложности с таймером, переименованием.
> ..?

файл находится на сервере, его одновременно используют много (> 10)человек, я дорабатываю на лету, скидываю версию - при следующем запуске она подхватывается, просто бывает что они неперезапускают exe по несколько суток (диспетчера), и получается что у них стоит уже несколько устаревшая версия.


> umbra ©   (21.10.05 17:31) [4]
> Честно говоря, мне не верится, что можно переименовать файл,
>  отображенный в память. может я темный, но не верю. да и
> сабж об этом говорит. для обновления файла все же лучше
> его закрыть, заменить, запустить заново.

а ты проверь в WinXP - Запусти его и попробуй переименовать.


BiN   (2005-10-21 17:34:00) [6]


> Семен Сорокин ©   (21.10.05 17:04)


Вместо GlobalData.FileName  'test.exe' подставлял?


umbra   (2005-10-21 17:31:00) [7]

Честно говоря, мне не верится, что можно переименовать файл, отображенный в память. может я темный, но не верю. да и сабж об этом говорит. для обновления файла все же лучше его закрыть, заменить, запустить заново.


clickmaker   (2005-10-21 17:29:00) [8]


> Семен Сорокин ©   (21.10.05 17:24) [2]

а, ну да...
а зачем вовще такие сложности с таймером, переименованием...?


Семен Сорокин   (2005-10-21 17:24:00) [9]


> clickmaker ©   (21.10.05 17:20) [1]
> а что такое GlobalData.FileName?

это record я писал в [0]
GlobalData.FileName - при запуске заполняется ParamStr(0);
GlobalData.Version - соответственно версией


clickmaker   (2005-10-21 17:20:00) [10]

а что такое GlobalData.FileName?


Наверх

Титульная страница Поиск, карта сайта Написать письмо