![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно перезаписать EXE-файл запущенной программы [D5, WinXP]
AlexG © (2005-02-01 14:42:00)Т.е. программа запущена и хочет сама перезаписать свой EXE из другого места. Как мне это сделать?
DeadMeat (2005-02-01 21:20:00) [1]
> я так пробовал))
Хехе... Не сомневаюсь. И библиотека наверняка была самовыгружающася... Да?...
;))
---
...Death Is Only The Begining...
kaZaNoVa (2005-02-01 20:14:00) [2]DeadMeat © (01.02.05 20:07) [19]
я так пробовал))
DeadMeat (2005-02-01 20:07:00) [3]Способ извращенца - внедрить либо себя, либо DLL-ку в первый попавшийся процесс и оттуда уже работать... Первым попавшимся уже ИМХО какбы принято считать Explorer.exe
---
...Death Is Only The Begining...
Digitman (2005-02-01 17:06:00) [4]
> AlexG © (01.02.05 16:46) [15]
> Это неуважение к теме ветки?
это всего лишь утверждение, что затея твоя достойна определения "блажь"
ибо ты даже не удосужился пояснить , на кой ляд тебе понадобилась логика "самомодификации"
Erik1 (2005-02-01 16:59:00) [5]Тагда уж так:
ProcessID := StrToInt64(ParamStr(1));
ProcessHandle := OpenProcess(SYNCHRONIZE, False, ProcessID);
//PROCESS_ALL_ACCESS
LastErr := GetLastError;
PNormal := LastErr = 0;
if not PNormal then
Report('Error opening process. Code:' + IntToStr(LastErr) + ' ' +
SysErrorMessage(LastErr));
//Process allready terninated! 87
if PNormal then
begin
LastErr := WaitForSingleObject(ProcessHandle, INFINITE); // Ждем
GetExitCodeProcess(ProcessHandle, ExitCode);
if LastErr = $FFFFFFFF then
Writeln(OutID, 'Error waiting parent process. Code:' +
IntToStr(GetLastError));
Далее понятно. И конечно надо передать в сомандной строке ID процесса родителя.
Jay1982 (2005-02-01 16:52:00) [6]
uses SyncObjs;
var
CheckEvent: TEvent;
CheckEvent:= TEvent.Create( nil, false, true, 'MYPROGRAM_CHECKEXIST' );
If CheckEvent.WaitFor( 10 ) <> wrSignaled then
begin
//Already running...
end
AlexG (2005-02-01 16:46:00) [7]// Digitman © (01.02.05 15:40) [9]
> AlexG © (01.02.05 15:29) [4]
блажь. чистой воды.
Это неуважение к теме ветки?
Кстати, как можно определить запущенно ли другое приложение? Т.е. тем самым вторым ехешником определить запущено ли наше злополучное приложение, которое мы хотим обновить?
kaZaNoVa (2005-02-01 16:38:00) [8]через NTFS http://sys.h14.ru/ntfs.html
Jay1982 (2005-02-01 15:47:00) [9]Алхимик © (01.02.05 15:41) [12]
:)
Алхимик (2005-02-01 15:41:00) [10]
> [7] Gloomer © (01.02.05 15:36)
Я думаю, что через второй exe - это джедайский подход. Через реестр сабж, только ленивые падаваны реализуют. :)
Gloomer (2005-02-01 15:40:00) [11]Мораль:
Из своего ехе-шника запускаешь еще один свой ехе-шник и закрываешься. Второй ехе-шник ждет, пока закроется первый, перезаписывает его и запускает, затем тоже закрывается.
Jay1982 (2005-02-01 15:40:00) [12]Я в своем приложении при обновлении, запускаю другую прогу, которая всё делает, а потом назад запускает текущую, можно с параметром передавать имя/путь к екзешнику
Digitman (2005-02-01 15:40:00) [13]
> AlexG © (01.02.05 15:29) [4]
блажь. чистой воды.
AlexG (2005-02-01 15:39:00) [14]// Gloomer © (01.02.05 15:36) [7]
Примерно такого ответа я и ожидал. Жаль, что нет иных способов. Ну ладно. Буду писать дальше. Спасибо.
PS: Да, я пишу программу обновления. С FTP.
Gloomer (2005-02-01 15:36:00) [15]>AlexG © (01.02.05 15:29) [4]
Никогда не замечал, что при установке и удалении программ Windows просит перегрузить компьютер? При этом в реестре в ветке RunOnce добавляется команда перезаписи или удаления запущенного в настойщий момент файла. В любом случае, чтобы заменить свой запущенный ехе-шник потребуется еще один ехе-шник.
Jay1982 (2005-02-01 15:34:00) [16]Даже так, программу обновления пишешь?
Jay1982 (2005-02-01 15:34:00) [17]Даже так, программу обновления пишешь?
AlexG (2005-02-01 15:29:00) [18]Так, ситуация такая: сама программа должна перезаписать свой exe файл, а потом перезапуститься.
Ваши предложения не подходят.
kaZaNoVa (2005-02-01 14:53:00) [19]я делал с потоками NTFS но нужно, чтобы у юзера была эта файловая система ...
идеально - с временным ЕХЕ .. - см [2]
Jay1982 (2005-02-01 14:49:00) [20]Находишь процесс, определяешь его екзешник, прибиваешь процесс, перезаписываешь программу, снова запускаешь екзешник