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

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

Помогите  с  WaitForSingleObject


sunwheel1 ©   (2003-04-28 12:38:00) 

Возникла необходимость запускать из своей программы инсталятор BDE. Взял пример из FAQ`а (код приведен ниже)и столкнулся с проблемой. Файл bde511en.exe запускается, распаковывает во времменый каталог дистрибутив и все на этом заканчивается. Моя программа стоит на строке WaitForSingleObject и ждет когда отработает инсталятор, а инсталятор неизвестно чего ждет. Начинает установку BDE, если принудительно завершить мою программу. Как я понимаю рыть надо в сторону установки каких-то флагов.
Буду признателен за любую подсказку.

Var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
cmdline:string;
....

ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:="bde511en.exe";
if not CreateProcess( nil, // No module name (use command line).
PChar(cmdline), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
nil, // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi ) // Pointer to PROCESS_INFORMATION structure.
then ShowMessage( "CreateProcess "+cmdline+" failed." )
else Begin
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
end;


Proton   (2003-05-01 09:25:00) [1]

В каталоге
"D:\Program Files\Common Files\Borland Shared\BDE\"
есть файлик bdeinst.cab, внутри его BdeInst.dll внутри его DllRegisterServer. Вызывай и будет тебе счастье.


Zelius   (2003-04-28 17:14:00) [2]

To Anet (28.04.03 14:02)
вы не правы, 1 - CloseHandle по правилам хорошего тона нужно вызывать и 2 - после завершения программы хендл процесса действителен, по нему можно узнать код завершения процесса - GetExitCodeProcess.


jack128   (2003-04-28 16:25:00) [3]

Anet (28.04.03 14:02)
> В любом случай CloseHandle - это не верно, система сама
> освобождает всю память, связанную с процессом.
Система не освободит память, связанную с процессом, пока программа не закроет Handle


Anet   (2003-04-28 14:02:00) [4]

Понимаешь, насколько я знаю инсталлятор InstallShield используtт системные приложения для работы.
В любом случай CloseHandle - это не верно, система сама освобождает всю память, связанную с процессом. А Closehandle нужно исп-ть после OpenProcess. К тому же после завершения процесса -после Waitfor...-его хэндл уже не имеет смысла.

Я с подобной проблемой столкнулся, когда создавал процесс explorer.exe. В этом случае Waitfor возвращался сранемедленно.


sunwheel1   (2003-04-28 13:22:00) [5]

Anet CloseHandle не успевает отрабатывать, моя программа останавливается на WaitForSingleObject и ждет завершения bde511en.exe. Пытался запускать другие программы вместо "bde511en.exe", все работало нормально, т.е. программа нормально запускалась и после своего завершения, моя программа продолжала работу.


Anet   (2003-04-28 13:10:00) [6]

Убери CloseHandle - оставm Wait и попробуй снова


sunwheel1   (2003-04-28 13:04:00) [7]

>Anet (28.04.03 12:58)
Запускается.

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


Anet   (2003-04-28 12:58:00) [8]

Инсталлятор запускается без WaitFor... и CloseHandle ?


sunwheel1   (2003-04-28 12:57:00) [9]

Забыл добавить: OS - Windows 2000, прав достаточно, Delphi 5. Если просто запускать bde511en.exe через проводник, все нормально ставиться.


sunwheel1   (2003-04-28 12:55:00) [10]

Без Дельфи запускал, тоже самое. :(


Digitman   (2003-04-28 12:54:00) [11]

ОС какая ? административые права достаточны для выполнения инсталляции ?


Anet   (2003-04-28 12:51:00) [12]

Да Delphi7 не всегда корректно справляется с CreateProcess, пытаясь по-видимому дебугить и твой созданный процесс (а может и нет). Запусти свою прогу не из дельфы и посмотри, что получится.
Кстати CloseHandle(pi.hprocess (и hThread)) здесь совсем не к месту.


Наверх

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