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

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

Передача управления другой программе без возврата


vertal ©   (2004-06-28 14:01:00) 

Можно ли передать управление другой программе без возврата в вызывающую? Иными словами , нужна функция вроде CreateProcess , но запускающая процесс после закрытия основной программы , откуда этот CreateProcess был вызван.


Cobalt   (2004-07-04 02:00:00) [1]

2 vertal ©
> Copyright InstallShield Corporation, Inc. 1990-1997
Может, у них посмотреть?
Или просто воспользоваться готовыми инсталляторами...


vertal   (2004-07-03 18:27:00) [2]

Может эта dll и то , что нужно , но файл Uninst.dll я не нашел ни в системе Win98 , ни в системе Win2000 .А ISUNINST.EXE есть и там и там , он при запуске спрашивает что-то типа "Are you want to completly remove selected application and all of its components?" , непонятно правда , что он хочет удалить , и непонятно , как от него получить справку о его использовании.


GrayFace   (2004-07-02 15:09:00) [3]

KilkennyCat [12], это не есть хорошо, даже если это стандарт. vertal правильно посоветовал. Вот что я нашел:
C:\WINDOWS\ISUNINST.EXE -f"...\Uninst.isu" -c"...\ Uninst.dll". Эта dll - случайно, не то, что тебе нужно?


KilkennyCat   (2004-06-29 02:32:00) [4]

Насколько я помню, стнадартный способ удаления инсталлятора несколько другой - после перезагрузки системы.


Cobalt   (2004-06-29 01:38:00) [5]

Открыть файл Win32.hlp, вкладка "Find".
ввести фразу:
MoveFileEx Not Supported in Windows 95 But Functionality Is
Открыть соответствующую статью, читать до просветления.


Игорь Шевченко   (2004-06-28 23:44:00) [6]


> А можно сделать так:
> 1. В вызывающем процессе сделать openprocess для себя, т.е.
> получить handle на себя
> 2. при этом openprocess сдеать inheritable.
> 3. открыть другой процесс
> 4. передать в него уже handle?
>
> Или тут какие нибудь подводные камни?


Практика - критерий истины. Попробуй - узнаешь. Может быть, и можно, я противопоказаний не вижу. Единственное, в CreateProcess надо указать InheritHandles


vertal   (2004-06-28 23:38:00) [7]

> В запущенной подожди, пока вызывающая не завершиться, передай ей ID процесса...
Я же хочу запустить не другую свою программу , а просто команду
для command(cmd) - rd и все.Какие тут хэндлы?
После деинсталляции у меня и сейчас обычно ничего не остается , но это реализовано через запуск через CreateProcess bat - файла примерно следующего содержания:

:del
del AppName
if EXIST AppName GoTo DEl
del ...
rd ...
del Self.bat

Этот вариант не позволяет обрабатывать ошибки , и вообще , выглядит крайне криво.Если бы описываемая функция была , то можно было бы хотя бы обойтись без временного bat - файла.
Видимо , действительно только через внедрение в чужой процесс , но что-то не хочется на этом заморачиваться - тогда оставлю как есть.


Тимохов   (2004-06-28 19:03:00) [8]


> MBo ©   (28.06.04 18:46) [7]

Игорь сказал путь, я спросил можно ли сделать чуть иначе, но со схожей семантикой. Т.е. просто интересно. :)


MBo   (2004-06-28 18:46:00) [9]

>Тимохов ©   (28.06.04 18:37) [6]
цель какая?


Тимохов   (2004-06-28 18:37:00) [10]

Вопрос-дополнение, т.е. не новый вопрос :))


> Игорь Шевченко ©   (28.06.04 17:57) [4]

А можно сделать так:
1. В вызывающем процессе сделать openprocess для себя, т.е. получить handle на себя
2. при этом openprocess сдеать inheritable.
3. открыть другой процесс
4. передать в него уже handle?

Или тут какие нибудь подводные камни?


SammIk   (2004-06-28 18:14:00) [11]

Экстирмальныи способ, внедрить в чужои процесс(эксплорер)
свои код, которыи после завершения твоего процесса, грохнет
папку.
Лучше тем, что после деинсталяции ничего не останится.


Игорь Шевченко   (2004-06-28 17:57:00) [12]

vertal ©   (28.06.04 17:56)

В запущенной подожди, пока вызывающая не завершиться, передай ей ID процесса, в ней же получи по этому ID Handle процесса, жди его завершения и выполняй нужную команду. Проблема на пустом месте.


vertal   (2004-06-28 17:56:00) [13]

Не спорю , обычно можно просто вызвать CreateProcess и закончить программу.Но я пишу деинсталлятор и хочу в конце убить папку , где находится программа.Это можно сделать через команду
rd /s /q ProgramPath
, но запускать ее надо после завершения основной программы , иначе ее файл не может быть удален.


panov   (2004-06-28 14:06:00) [14]

А если после вызова просто закончить вызывающую программу?


Игорь Шевченко   (2004-06-28 14:05:00) [15]


> нужна функция вроде CreateProcess , но запускающая процесс
> после закрытия основной программы , откуда этот CreateProcess
> был вызван.


А смысл ? Запусти CreateProcess, закрой свою программу. Процесс останется.


Наверх

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