![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача управления другой программе без возврата
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, закрой свою программу. Процесс останется.