Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB6 > CreateProcess & Windows98 |
Автор: Fon 17.11.2005, 18:27 | ||
Доброе время суток. Подскажите, может кто-то с чем-то подобным сталкивался: нужно запустить консольное приложение используя CreateProcess. Приложение должно работать в фоновом режиме, т.е. кронсоль после запуска не должна появляться, также нужно отследить окончание его работы. Вот код который я использую для реализации этого:
Все хорошо работает под Win2000, WinXP но отказывается работать под Win98 - CreateProcess вызвращает 0 соответственно процесс не может создаться... Всем спасибо. |
Автор: Kergan 17.11.2005, 18:34 |
GetLastError что выдает? |
Автор: Fon 17.11.2005, 19:13 | ||||
Добавил в код вызов GetLastError
GetLastError возвращает, что все ОК The operation completed successfully!!! Но, вот парадокс CreateProcessA не выполняется, возвращает 0, соответственно ничего не происходит! Возможно дело в запускаемом приложении... Я запускаю osql для выполнения скрипта на сервере. Вот примерный вид строки
Что не так, не пойму... |
Автор: Kergan 18.11.2005, 09:17 |
Оригинально... А с другими приложениями пробовал? С чем-нибудь простеньким - cmd.exe, блокнот, калькулятор... PS А почему именно CreateProcess? можно Shell или ShellExecute? |
Автор: Fon 18.11.2005, 10:17 |
С другими тоже пробовал, не получается........, причем пробовал на разных компюьтерах с 98 виндой...... CreateProcess потому что, мне нужно скрыть окно и отследить завершение работы запускаемой программы. |
Автор: Kergan 18.11.2005, 12:22 |
Будем пробовать ShellExecute... Там последний параметр - как отображать окно программы, его делаешь SW_HIDE. \Поэксперементируй!\ Ну, по поводу ожидания завершения - этот фокус можно с любым процессом проделать - получить его хэндл при помощи OpenProcess Эта функция потребует идентификатор PID процесса - его тоже получить несложно при помощи функций toolhelp (перечисления процессов). и потом, как ты и написал, WaitForSingleObject Если нужно подробнее, пиши. |
Автор: Kergan 18.11.2005, 12:41 | ||
Вот, что-то типа этого... |
Автор: Fon 18.11.2005, 13:55 |
О, супер, спасибо!!! Кажеться в таком варианте все работает! Слушай, правда, я почитал МСДН и у меня возник еще один вопрос по теме: при описании ф-ции OpenProcess описываются значения парамметра dwDesiredAccess. В нашем случае используется SYNCHRONIZE, т.к. нам нужно будет отслеживать окончание работы программы. Вопрос в следующем: при описании SYNCHRONIZE около него стоит метка "Windows NT/2000", не будет ли это означать, что такое значение dwDesiredAccess не поддерживается Вин98? |
Автор: Kergan 18.11.2005, 16:16 |
Открой с приоритетом не SYNCHRONIZE, а PROCESS_ALL_ACCESS... если винда даст... Это даст тебе ПОЛНЫЙ контроль над процессом. виндовоз 98 не должен возмущаться, если есть права админа. PS вот пример, тестированный в 2000 и XP (там прямо внутри код) Извлекаешь оба exe-файла в одну диру, запускаешь PR1.exe, он запускает PR2.exe (там на форме будет написано "Закрой это окно"), потом сообщение о том, что окно открылось + идентификатор процесса PR2. Закрой PR2 и будет сообщение о закрытии ОТ PR1. До того, как ты закроешь PR2, PR1 будет недоступна (курсорчик часами). |