![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить EXEшник и на его место записать другой? [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Олег_В © (2002-07-11 00:57:00)Короче нужно сделать обновление проги, обновление подчитывается самим EXE. Слышал, что можно через реестр с перегрузом компа. Подскажите, кто знает!
kostik78ua (2002-10-28 15:12:00) [1]Уточню свой ответ:
В Win2K функция CopyFile как раз перетирает любой запущеный файл.
Под Win9х функция так не работает.
Anatoly Podgoretsky (2002-10-25 18:52:00) [2]Это работает на очень раннией стадии
Dm9 (2002-10-25 18:33:00) [3]>>Lmatveev
>Когда выполняется RunOnce, модули которые необходимо обновить могут быть уже загружены.
А при использовании wininit.ini модули не могут быть загружены?
Я бы, например, пользовался способом черз реестр.
Pumpkin (2002-10-24 21:54:00) [4]> [Rename]
> NUL=c:\katalog\old.exe
> c:\katalog\old.exe=c:\katalog\new.exe
Первую строчку (NUL=) можно убрать и без нее все прокатит.
> А что раньше происходит - проверка wininit.ini или RunOnce?..
wininit.ini самый первый
По сути:
Если ты не меняешь системных файлов, проще будет переписаться и перезапуститься из bat-файла (запускаешь и выходишь)
--- cut ---
:aa
del myprg.exe
if exist myprg.exe goto aa
ren myprg.000 myprg.exe
myprg.exe
--- cut ---
Я обычно использую маленькую програмку с аналогичной функциональностью (подождать, пока главная прога закроется, заменить ее, потом запустить снова) и держу ее в ресурсах.
Дуся (2002-10-24 21:31:00) [5]А что раньше происходит - проверка wininit.ini или RunOnce?..
Мне надо подменить системные библиотечки .... которые конечно же используются ....
RunOnce только что пробовала - не помог. Он выполняется когда уже винда в графический режим вошла ...
kostik78ua (2002-10-24 18:50:00) [6]Попробуй так:
CopyFile("Project1.exe", "Project1_tmp.exe", false);
CopyFile("Project1_tmp.exe", "Project1.exe", false);
DeleteFile("Project1.exe");
DeleteFile("Project1_tmp.exe");
Игорь2002 (2002-09-03 09:46:00) [7]Как вариант можно выгрузить обновляемый файл (к примеру Terminate Process-ом), затем скопировать что и куда надо, а потом запустить новый файл.
german ivanov (2002-07-14 06:00:00) [8]1) из своей программы создайте бат-файл, который в цикле пробует удалить вашу прогу и если это получилось,выходит из цикла.
2) запустите этот бат файл.
3) закройте _свое_ приложение.
turusov (2002-07-12 16:01:00) [9]С этой проблемой сталкивался. Моя прога находится в сети и ей пользуются пользователями, которых нет возможности попросить выйти.
Сделал им ярлык на загружаемый EXE, типа LoadEXE, которому в качестве параметра передаю маску ВОЗМОЖНЫХ основных EXE, типа c:\LoadEXE h:\MyProg*.exe и по необходимости сбрасываю MyProg1.exe MyProg2.exe … MyProg99.exe :)
LoadEXE смотрит время создания файла и запускает последний.
Есть рабочая прога 386kB
Eugene Lachinov (2002-07-12 13:53:00) [10]>Lmatveev
Когда выполняется RunOnce, модули которые необходимо обновить могут быть уже загружены.
Lmatveev (2002-07-12 12:28:00) [11]Вообще, чтобы некая программа выполнилась один раз при запуске Windows ее надо указать в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (можно и в HKCU). Этот путь рекомендуется Microsoft и так делает WindowsInstaller. Использовать wininit.ini тоже можно, но это все равно, что использовать WinExec вместо CreateProcess, т.к. и wininit.ini и WinExec поддерживается только для совместимости с ранними версиями.
_SEM_ (2002-07-12 12:13:00) [12]Я делаю так:
Wininit.ini
[Rename]
NUL=c:\katalog\old.exe // удалить старый файл
c:\katalog\old.exe=c:\katalog\new.exe // занести на его место новый
После чего вызываешь перегрузку
AST (2002-07-12 10:32:00) [13]{ из своей программы запускаешь эту программу с параметрами:
upgrader ОбновляемаяПрограмма НоваяПрограмма
и закрываешь свое приложение. Все. Никакой перезагрузки. У меня на этом построена вся система автоматического обновления.
Замечу что данный кусок кода не мой а взят с какого-то сайта со схожей тематикой.
Процедура WinExecAndWait32 - взята из советов Озерова.
}
program upgrader;
uses Windows, SysUtils, FileUtil, Messages, WinTypes;
var
Msg: TMsg;
DestFileName: string;
begin
// Must be started with 2 command line parameters:
// 1: Exe-name of application
// 2: Location of Upgrade.tmp (downloaded file)
DestFileName := ParamStr(1);
if ParamCount = 2 then begin
repeat
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
until DeleteFiles(DestFileName); // Delete old version
// Copy Upgrade.tmp to the newestversionname...
//MoveFile(PChar(ParamStr(2)),PChar(DestFileName));
// Delete Upgrade.tmp
//DeleteFile(PChar(ParamStr(2)));
// Запускаем программу и ждем завершения ее работы
WinExecAndWait32(ParamStr(2), sw_ShowNA);
{ полсе завершения работы программы обновления - перезапускаем программу }
WinExec(PChar(DestFileName), sw_ShowNA);
end;
end.
Eugene Lachinov (2002-07-12 08:43:00) [14]Под Windows NT, 2000, XP посмотри описание функции MoveFileEx,
>Юрий Зотов
Это все ночь, или Вы сейчас на Камчатке :-)
Юрий Зотов (2002-07-12 01:07:00) [15]Спорить не буду, наверное и правда Wininit.ini - я же писал по памяти, а последний раз использовал эту штуку уже давно, вполне мог забыть детали. Впрочем, суть не в них.
А проходить это, по идее, должно под всеми форточками - поскольку этот механизм вполне легальный и официально документированный. Его используют, например, инсталляторы (патчи и пр.) для замены DLL и других открытых файлов.
Олег_В (2002-07-12 00:48:00) [16]Спасибо за консультацию. Под Win98, действительно все проходит через wininit.ini, под остальными пока не пробовал, но, думаю и там прокатит...
Eugene Lachinov (2002-07-11 09:22:00) [17]И файл называется Wininit.ini
Eugene Lachinov (2002-07-11 09:14:00) [18]>Юрий Зотов
Это проходит в Windows NT, 2k, XP ?
Юрий Зотов (2002-07-11 01:16:00) [19]Это делается через WinStart.ini. Рассказывать долго, лучше сделайте так. Проинсталируйте у себя любую достаточно серьезную программу, котрая после инсталляции просит перезагрузку. Но когда она ее спросит, скажите "позже", а сами посмотрите файл WinStart.ini, который она только что создала в системном каталоге - в нем все и увидите. При перезагрузке система автоматически выполнит команды из этого файла, а сам файл уничтожит.
В общем, запишите новый exe в нужный каталог под именем, например, New.exe, а в системном каталоге создайте файл WinStart.ini с примерно таким текстом:
[Rename]
Old.exe =
New.exe = Old.exe
И запросите перезагрузку. Все остальное сделает система.