Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
ВнизВзять правильную версию переименованого EXE-файла? Найти похожие ветки
← →
Семен Сорокин © (2005-10-21 17:04) [0]Приветствую!
Ситуация следующая: есть запущенный 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.
Где собака порылась? :-) кто подскажет?
← →
clickmaker © (2005-10-21 17:20) [1]а что такое GlobalData.FileName?
← →
Семен Сорокин © (2005-10-21 17:24) [2]
> clickmaker © (21.10.05 17:20) [1]
> а что такое GlobalData.FileName?
это record я писал в [0]
GlobalData.FileName - при запуске заполняется ParamStr(0);
GlobalData.Version - соответственно версией
← →
clickmaker © (2005-10-21 17:29) [3]
> Семен Сорокин © (21.10.05 17:24) [2]
а, ну да...
а зачем вовще такие сложности с таймером, переименованием...?
← →
umbra © (2005-10-21 17:31) [4]Честно говоря, мне не верится, что можно переименовать файл, отображенный в память. может я темный, но не верю. да и сабж об этом говорит. для обновления файла все же лучше его закрыть, заменить, запустить заново.
← →
BiN © (2005-10-21 17:34) [5]
> Семен Сорокин © (21.10.05 17:04)
Вместо GlobalData.FileName "test.exe" подставлял?
← →
Семен Сорокин © (2005-10-21 17:36) [6]
> clickmaker © (21.10.05 17:29) [3]
> а, ну да...
> а зачем вовще такие сложности с таймером, переименованием.
> ..?
файл находится на сервере, его одновременно используют много (> 10)человек, я дорабатываю на лету, скидываю версию - при следующем запуске она подхватывается, просто бывает что они неперезапускают exe по несколько суток (диспетчера), и получается что у них стоит уже несколько устаревшая версия.
> umbra © (21.10.05 17:31) [4]
> Честно говоря, мне не верится, что можно переименовать файл,
> отображенный в память. может я темный, но не верю. да и
> сабж об этом говорит. для обновления файла все же лучше
> его закрыть, заменить, запустить заново.
а ты проверь в WinXP - Запусти его и попробуй переименовать.
← →
Семен Сорокин © (2005-10-21 17:37) [7]
> BiN © (21.10.05 17:34) [5]
> Вместо GlobalData.FileName "test.exe" подставлял?
явно нет, но отладчиком проходил - показывает не переименованный...
← →
umbra © (2005-10-21 17:45) [8]нет, что в эксплорере будет видно новое имя - вполне возможно, возражений нет. Но ntfs - журналируемая файловая система, и реальные изменения могут быть отложены на будущее, когда они будут возможны
← →
clickmaker © (2005-10-21 17:48) [9]я бы сделал так
ты скидываешь свежак в шару
пишешь что-то типа лончера, в котором сравниваешь локальную и сервачную версии, если свежая - качаешь, запускаешь экзешник.
Для тех, кто сидит безвылазно, можно оставить таймер, но просто напоминать при наличии свежей версии, что мол она появилась, и если вы хотите обновицца, перезапускайтесь
← →
Семен Сорокин © (2005-10-21 17:54) [10]
> umbra © (21.10.05 17:45) [8]
> нет, что в эксплорере будет видно новое имя - вполне возможно,
> возражений нет. Но ntfs - журналируемая файловая система,
> и реальные изменения могут быть отложены на будущее, когда
> они будут возможны
хммм, наверное так и есть
> clickmaker © (21.10.05 17:48) [9]
придумал похожий механизм, просто наряду с этим проверять другое файло на шаре, тот же текстовик с последней версией файла.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c