![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взять правильную версию переименованого 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?