Страница: 1 |
Подскажите, как поймать коды возврата запускаемой программы? shell возвращает TaskId (или как это там называется) -- в общем, не то, WinExec возвращает свои коды, например, FileNotFound. Что тут можно сделать?
ShellExecute пробовал? все что приходит до 32 это ошибки... остальное PID Приведи кусок кода и объясни какого рода действия собираешся выполнять с окном... Я вообще не понял, что такое "коды возврата". Neco, Нет, здесь не в окнах дело. Например, запускаешь ты из своей программы другую, как узнать как отработала дочерняя программа? Для этого и служат коды возврата. Например, если родительской программе нужно вернуть сообщение (никакой связи с сообщениями vindows), о том, что "всё нормально", обычно возвращают 0. А в зависимости от критичности ошибки (или ситуации) возвращается всё большее значение. Вообще этот механизм чаще всего используется в пакетниках, но и в реальной программе иногда нужен. В старых языках (под DOS в смысле) сами функции запуска возвращали код возврата, да была ещё прекрасная функция 4dh прерывания 21h -- всё, что поддерживало asm могло получить этот самый код возврата. Ну, это лирическое отступление; сейчас ShellExecute попробуем. Я так, понял, что надо получить код завершения программы запущенной через Shell. Вот код для запуска программы (не через Shell, a через CreateProcess), ожидающей завершение выполнения и возвращающий код завершения. Private Type STARTUPINFO Private Type PROCESS_INFORMATION Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _ Private Const INFINITE = -1& On Error GoTo ErrHand Для вызова функции: Ret = ExecCmd("c:\1.exe") Страница: 1 |
Вопрос: Коды возврата
Добавлено: 06.12.03 06:32
Автор вопроса: S_Serg
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #1
Добавлено: 06.12.03 07:06
Shell возвращает идентификатор процесса, запускаемой программы... Что ещё нужно?
Номер ответа: 2
Автор ответа:
Slay
Вопросов: 27
Ответов: 150
Web-сайт:
Профиль | | #2
Добавлено: 06.12.03 09:38
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 06.12.03 14:08
Номер ответа: 4
Автор ответа:
S_Serg
Вопросов: 9
Ответов: 25
Профиль | | #4
Добавлено: 06.12.03 16:15
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 07.12.03 07:56
Попробуй GetLastError после вызова функции. Вроде в ДОСе также было.
Номер ответа: 6
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #6
Добавлено: 07.12.03 10:21
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
pApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20&
Public Function ExecCmd(cmdline$)
Dim Proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO ' Initialize the STARTUPINFO structure:
Dim Ret As Long
Start.cb = Len(Start)
' Start the shelled application:
Ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, Start, Proc)
' Wait for the shelled application to finish:
Ret& = WaitForSingleObject(Proc.hProcess, INFINITE)
Call GetExitCodeProcess(Proc.hProcess, Ret&
Call CloseHandle(Proc.hThread)
Call CloseHandle(Proc.hProcess)
ExecCmd = Ret&
Exit Function
ErrHand:
ExecCmd = -1
End Function