Форум: "Система";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
ВнизКак удалить EXEшник и на его место записать другой? Найти похожие ветки
← →
Олег_В (2002-07-11 00:57) [0]Короче нужно сделать обновление проги, обновление подчитывается самим EXE. Слышал, что можно через реестр с перегрузом компа. Подскажите, кто знает!
← →
Юрий Зотов (2002-07-11 01:16) [1]Это делается через WinStart.ini. Рассказывать долго, лучше сделайте так. Проинсталируйте у себя любую достаточно серьезную программу, котрая после инсталляции просит перезагрузку. Но когда она ее спросит, скажите "позже", а сами посмотрите файл WinStart.ini, который она только что создала в системном каталоге - в нем все и увидите. При перезагрузке система автоматически выполнит команды из этого файла, а сам файл уничтожит.
В общем, запишите новый exe в нужный каталог под именем, например, New.exe, а в системном каталоге создайте файл WinStart.ini с примерно таким текстом:
[Rename]
Old.exe =
New.exe = Old.exe
И запросите перезагрузку. Все остальное сделает система.
← →
Eugene Lachinov (2002-07-11 09:14) [2]>Юрий Зотов
Это проходит в Windows NT, 2k, XP ?
← →
Eugene Lachinov (2002-07-11 09:22) [3]И файл называется Wininit.ini
← →
Олег_В (2002-07-12 00:48) [4]Спасибо за консультацию. Под Win98, действительно все проходит через wininit.ini, под остальными пока не пробовал, но, думаю и там прокатит...
← →
Юрий Зотов (2002-07-12 01:07) [5]Спорить не буду, наверное и правда Wininit.ini - я же писал по памяти, а последний раз использовал эту штуку уже давно, вполне мог забыть детали. Впрочем, суть не в них.
А проходить это, по идее, должно под всеми форточками - поскольку этот механизм вполне легальный и официально документированный. Его используют, например, инсталляторы (патчи и пр.) для замены DLL и других открытых файлов.
← →
Eugene Lachinov (2002-07-12 08:43) [6]Под Windows NT, 2000, XP посмотри описание функции MoveFileEx,
>Юрий Зотов
Это все ночь, или Вы сейчас на Камчатке :-)
← →
AST (2002-07-12 10:32) [7]{ из своей программы запускаешь эту программу с параметрами:
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.
← →
_SEM_ (2002-07-12 12:13) [8]Я делаю так:
Wininit.ini
[Rename]
NUL=c:\katalog\old.exe // удалить старый файл
c:\katalog\old.exe=c:\katalog\new.exe // занести на его место новый
После чего вызываешь перегрузку
← →
Lmatveev (2002-07-12 12:28) [9]Вообще, чтобы некая программа выполнилась один раз при запуске Windows ее надо указать в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (можно и в HKCU). Этот путь рекомендуется Microsoft и так делает WindowsInstaller. Использовать wininit.ini тоже можно, но это все равно, что использовать WinExec вместо CreateProcess, т.к. и wininit.ini и WinExec поддерживается только для совместимости с ранними версиями.
← →
Eugene Lachinov (2002-07-12 13:53) [10]>Lmatveev
Когда выполняется RunOnce, модули которые необходимо обновить могут быть уже загружены.
← →
turusov (2002-07-12 16:01) [11]С этой проблемой сталкивался. Моя прога находится в сети и ей пользуются пользователями, которых нет возможности попросить выйти.
Сделал им ярлык на загружаемый EXE, типа LoadEXE, которому в качестве параметра передаю маску ВОЗМОЖНЫХ основных EXE, типа c:\LoadEXE h:\MyProg*.exe и по необходимости сбрасываю MyProg1.exe MyProg2.exe … MyProg99.exe :)
LoadEXE смотрит время создания файла и запускает последний.
Есть рабочая прога 386kB
← →
german ivanov (2002-07-14 06:00) [12]1) из своей программы создайте бат-файл, который в цикле пробует удалить вашу прогу и если это получилось,выходит из цикла.
2) запустите этот бат файл.
3) закройте _свое_ приложение.
← →
Игорь2002 (2002-09-03 09:46) [13]Как вариант можно выгрузить обновляемый файл (к примеру Terminate Process-ом), затем скопировать что и куда надо, а потом запустить новый файл.
← →
kostik78ua (2002-10-24 18:50) [14]Попробуй так:
CopyFile("Project1.exe", "Project1_tmp.exe", false);
CopyFile("Project1_tmp.exe", "Project1.exe", false);
DeleteFile("Project1.exe");
DeleteFile("Project1_tmp.exe");
← →
Дуся (2002-10-24 21:31) [15]А что раньше происходит - проверка wininit.ini или RunOnce?..
Мне надо подменить системные библиотечки .... которые конечно же используются ....
RunOnce только что пробовала - не помог. Он выполняется когда уже винда в графический режим вошла ...
← →
Pumpkin (2002-10-24 21:54) [16]> [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 ---
Я обычно использую маленькую програмку с аналогичной функциональностью (подождать, пока главная прога закроется, заменить ее, потом запустить снова) и держу ее в ресурсах.
← →
Dm9 (2002-10-25 18:33) [17]>>Lmatveev
>Когда выполняется RunOnce, модули которые необходимо обновить могут быть уже загружены.
А при использовании wininit.ini модули не могут быть загружены?
Я бы, например, пользовался способом черз реестр.
← →
Anatoly Podgoretsky (2002-10-25 18:52) [18]Это работает на очень раннией стадии
← →
kostik78ua (2002-10-28 15:12) [19]Уточню свой ответ:
В Win2K функция CopyFile как раз перетирает любой запущеный файл.
Под Win9х функция так не работает.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c