Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Слежение за процессом

16K
02 ноября 2006 года
stupid
13 / / 28.10.2006
Всем добрый вечер, щас попытаюсь объяснить что я хочу сделать в кратце. Смысл такой: Пользователь запускает скажем по средством кнопки ComandButton внешнюю программу например "xxx.exe" причём название внешней программы часто меняется и не постоянно. Мне нужно после выполнения ф-ии Show xxx.exe следить за процессом в памяти или гдето ещё, чтобы после того как юзер закончит работу в программе xxx.exe и выйдет и неё, моя программа выполнила определённые действия и тоже выгрузилась. Вот, ну это грубо конечно, ну смысл такой, пока процесс xxx.exe висит загруженным ничего не происходит, как только юзер закрыл процесс xxx.exe то скажем моя прога вывела сообщение "msgbox Счастливо оставаться!" С этой задачей я так понял надо бороться ф-ями API типа GETWindow (вот только эта ф-я возвращает дискриптор активного окна данной формы т.е. она мне не подойдёт), как это можно реализовать или подскажите просто функции Апишные?

Я сначало думал так: после загрузки файла xxx.exe с помощью АПИшной ф-ии получаю дискриптор активного окна, затем по дискриптору проверяю процесс раз в секунду напрмер загружен ли он, если нет то вывод сообщения.
Если кратко. Вообщем, эм спасибо.

2 Вопрос, чтото возник =) Вообще возможно прикрутить msdn 2003 к VB6.0? Хотя бы чисто гипотетически? Спасибо.
282
02 ноября 2006 года
Bard
481 / / 26.02.2006
Если ты имееш хендл главного окна - просто с помощью функцыи GetWindowText проверяеш заголовок окна. Если он равен пустому буферу - значит окна не существует. Ето прокатит только тогда, когда заголовок окна не равен пустой строке.
257
02 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
можно попробовать запустить твой xxx.exe с помощью функции CreateProcess, а потом с помощью функции WaitForSingleObject отслеживать состояние процесса, вроде бы так:
Код:
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim hproc As Long
Dim i As Integer
ZeroMemory(si,68);
si.cb=68 //68 размер структуры STARTUPINFO хотя лучше использовать какую-нить функцию для определения этого числа
si.dwFlags = &H1
si.wShowWindow = 4
hproc = CreateProcess("", "cmd.exe", 0, 0, False, &H4000000, 0, 0, si, pi)
While WaitForSingleObject(pi.hProcess,100)=WAIT_TIMEOUT
Wend

правильность не гарантирую(редко на Basic'е пишу). не забудь определить функции и типы данных.
16K
07 ноября 2006 года
stupid
13 / / 28.10.2006
Спасибо, покумекаем над вашим предложением. И всё таки что насчёт msdn2003 и VB6.0? Реально ли их связать?
10K
07 ноября 2006 года
АлРАД
58 / / 30.08.2006
msdn2003? Это вообще-то Visual Basic .Net, а он сильно отличается от VB6, начиная от типов данных до наследования.
Цитата:
И всё таки что насчёт msdn2003 и VB6.0? Реально ли их связать?

Не сможешь. Юзай VB7 - это и есть 2003.
ИЛИ
Найди в интернете vb_tutor.chm и MegaFlash VB Help - это лучшая что ни на есть справка по VB6
Good Luck

7
11 ноября 2006 года
@pixo $oft
3.4K / / 20.09.2006
[QUOTE=kosfiz]можно попробовать запустить твой xxx.exe с помощью функции CreateProcess, а потом с помощью функции WaitForSingleObject отслеживать состояние процесса, вроде бы так:
Код:
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim hproc As Long
Dim i As Integer
ZeroMemory(si,68);
si.cb=68 //68 размер структуры STARTUPINFO хотя лучше использовать какую-нить функцию для определения этого числа
si.dwFlags = &H1
si.wShowWindow = 4
hproc = CreateProcess("", "cmd.exe", 0, 0, False, &H4000000, 0, 0, si, pi)
While WaitForSingleObject(pi.hProcess,100)=WAIT_TIMEOUT
Wend

правильность не гарантирую(редко на Basic'е пишу). не забудь определить функции и типы данных.[/QUOTE]
Размер структуры получается с помощью LenB/Len,а вместо WaitForSingleObject(pi.hProcess,100) лучше написать WaitForSingleObject(pi.hProcess,-1),чтобы он не прерывал процесс ожидания.И While не будет нужен,только проверяй значение WaitForSingleObject-ищи константы на Wait_
19K
16 марта 2007 года
Kudri
15 / / 31.01.2007
Тема немного устарела, но все же напишу, потому что искала решение везде...

То что здесь описывалось, находила подобные тексты и на других форумах, но в итоге так запустить и не смогла... процедура CreateProcess всегда возвращала мне фалсе...

а вот этот вариант у меня работает...
Взято http://www.vbrussian.com/Trick.asp?ID=7
Запуск внешней программы с ожиданием ее завершения
Автор: Борис Рудой



Private Const INFINITE = &HFFFF

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, _
ByVal fInherit As Integer, ByVal hObject As Long) As Long

Private Sub Command1_Click()

WaitForProcessToEnd "C:\test.BAT"
'Let the user know when the process is finished.
MsgBox "The process is finished! "
End Sub



Public Sub WaitForProcessToEnd(cmdLine As String)
'You can substitute a discrete time
'value in milliseconds for INFINITE.
Dim retVal As Long, pID As Long, pHandle _
As Long
pID = Shell(cmdLine)
pHandle = OpenProcess(&H100000, True, pID)
retVal = WaitForSingleObject(pHandle, INFINITE)
End Sub
405
16 марта 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Kudri
... То что здесь описывалось, находила подобные тексты и на других форумах, но в итоге так запустить и не смогла...


Аналогичное решение не раз публиковалось и на этом форуме. Загляните, например, сюда:
http://forum.codenet.ru/showpost.php?p=68379&postcount=5

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог