Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.06;
Скачать: CL | DM;

Вниз

Как удалить 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
14-15211
Дмитрий К.К.
2002-12-04 14:28
2003.01.06
Где можно скачать список ВСЕХ тэгов HTML?


1-14976
ПростоСтудент1-гоКурса
2002-12-24 00:33
2003.01.06
Помогите плз проблемы с 0


8-15163
Pavel_s
2002-09-19 09:08
2003.01.06
TImage


1-15051
Groove
2002-12-25 06:57
2003.01.06
Как создать файл со своей структурой


6-15191
Evgeniy
2002-11-08 02:52
2003.01.06
Client/Server