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