Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-15134
DenK_vrtz
2002-12-23 13:17
2003.01.06
Сменить системную дату в NT


14-15228
Игорь Шевченко
2002-12-06 11:26
2003.01.06
Требуется программист


7-15318
ALexe K
2002-09-18 15:57
2003.01.06
Как сделать свою звонилку?


14-15260
Мазут Береговой
2002-12-16 21:49
2003.01.06
теорией реляционных баз данных


3-14959
Max Zyuzin
2002-12-15 10:14
2003.01.06
Drag&Drop в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский