Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно перезаписать EXE-файл запущенной программы [D5, WinXP]


Страницы:   1 2

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]

Находишь процесс, определяешь его екзешник, прибиваешь процесс, перезаписываешь программу, снова запускаешь екзешник


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо