Форум: "WinAPI";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизПомогите с WaitForSingleObject Найти похожие ветки
← →
sunwheel1 (2003-04-28 12:38) [0]Возникла необходимость запускать из своей программы инсталятор 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;
← →
Anet (2003-04-28 12:51) [1]Да Delphi7 не всегда корректно справляется с CreateProcess, пытаясь по-видимому дебугить и твой созданный процесс (а может и нет). Запусти свою прогу не из дельфы и посмотри, что получится.
Кстати CloseHandle(pi.hprocess (и hThread)) здесь совсем не к месту.
← →
Digitman (2003-04-28 12:54) [2]ОС какая ? административые права достаточны для выполнения инсталляции ?
← →
sunwheel1 (2003-04-28 12:55) [3]Без Дельфи запускал, тоже самое. :(
← →
sunwheel1 (2003-04-28 12:57) [4]Забыл добавить: OS - Windows 2000, прав достаточно, Delphi 5. Если просто запускать bde511en.exe через проводник, все нормально ставиться.
← →
Anet (2003-04-28 12:58) [5]Инсталлятор запускается без WaitFor... и CloseHandle ?
← →
sunwheel1 (2003-04-28 13:04) [6]>Anet (28.04.03 12:58)
Запускается.
Но мне необходимо, чтобы моя программа дождалась завершения установки BDE.
← →
Anet (2003-04-28 13:10) [7]Убери CloseHandle - оставm Wait и попробуй снова
← →
sunwheel1 (2003-04-28 13:22) [8]Anet CloseHandle не успевает отрабатывать, моя программа останавливается на WaitForSingleObject и ждет завершения bde511en.exe. Пытался запускать другие программы вместо "bde511en.exe", все работало нормально, т.е. программа нормально запускалась и после своего завершения, моя программа продолжала работу.
← →
Anet (2003-04-28 14:02) [9]Понимаешь, насколько я знаю инсталлятор InstallShield используtт системные приложения для работы.
В любом случай CloseHandle - это не верно, система сама освобождает всю память, связанную с процессом. А Closehandle нужно исп-ть после OpenProcess. К тому же после завершения процесса -после Waitfor...-его хэндл уже не имеет смысла.
Я с подобной проблемой столкнулся, когда создавал процесс explorer.exe. В этом случае Waitfor возвращался сранемедленно.
← →
jack128 (2003-04-28 16:25) [10]Anet (28.04.03 14:02)
> В любом случай CloseHandle - это не верно, система сама
> освобождает всю память, связанную с процессом.
Система не освободит память, связанную с процессом, пока программа не закроет Handle
← →
Zelius (2003-04-28 17:14) [11]To Anet (28.04.03 14:02)
вы не правы, 1 - CloseHandle по правилам хорошего тона нужно вызывать и 2 - после завершения программы хендл процесса действителен, по нему можно узнать код завершения процесса - GetExitCodeProcess.
← →
Proton (2003-05-01 09:25) [12]В каталоге
"D:\Program Files\Common Files\Borland Shared\BDE\"
есть файлик bdeinst.cab, внутри его BdeInst.dll внутри его DllRegisterServer. Вызывай и будет тебе счастье.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c