Пенсионер
Гость
|
|
« : 23-10-2003 15:08 » |
|
Как решить задачу? Необходимо вначале выполнить прогу которая создаст файл А потом загрузить результат файла? Делую так:
Shell "CMD /c " & App.Path & "\Proga.exe" Open App.Path & "\work.tmp" For Input As #1 ...
Но файл не успевает создатся.... как поставить задержку на время пока выполняется "Proga.exe"?
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #1 : 24-10-2003 11:13 » |
|
Возможно так
Dim RetVal
---
RetVal = 0 RetVal = Shell("CMD /c " & App.Path & "\Proga.exe" ) ' Запуск проги. do while RetVal = 0 ' loop '
Open App.Path & "\work.tmp" For Input As #1
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Пенсионер
Гость
|
|
« Ответ #2 : 24-10-2003 12:46 » |
|
Проблема в том что Shell возврощает значение после запуска CMD , а не при завершении Proga.exe 8(((
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 24-10-2003 13:05 » |
|
В kernel32 есть функция CreateProcecss(), с помощью которой можно ждать окончания запущенного процесса. Только как сделать для неё врапер в Васике я не знаю. Знаю только, что такое возможно. STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); BOOL bRes = CreateProcess(NULL, "test,exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
|
|
« Последнее редактирование: 20-11-2007 18:11 от Алексей1153++ »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Пенсионер
Гость
|
|
« Ответ #4 : 24-10-2003 13:23 » |
|
Ух.....
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #5 : 24-10-2003 13:31 » |
|
Во чего в MSDN есть Option Explicit
Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As Long End Type
Private Type STARTUPINFO 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
Private Declare Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" _ (ByVal lpApplicationName As String, _ ByVal lpCommandLine As String, _ lpProcessAttributes As Any, _ lpThreadAttributes As Any, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ lpEnvironment As Any, _ ByVal lpCurrentDriectory As String, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" _ (ByVal dwAccess As Long, _ ByVal fInherit As Integer, _ ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" _ (ByVal hProcess As Long, _ ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long
Const SYNCHRONIZE = 1048576 Const NORMAL_PRIORITY_CLASS = &H20&
Private Sub Form_Click() Dim pInfo As PROCESS_INFORMATION Dim sInfo As STARTUPINFO Dim sNull As String Dim lSuccess As Long Dim lRetValue As Long
sInfo.cb = Len(sInfo) lSuccess = CreateProcess(sNull, _ "Calc.exe", _ ByVal 0&, _ ByVal 0&, _ 1&, _ NORMAL_PRIORITY_CLASS, _ ByVal 0&, _ sNull, _ sInfo, _ pInfo)
MsgBox "Calculator has been launched!"
lRetValue = TerminateProcess(pInfo.hProcess, 0&) lRetValue = CloseHandle(pInfo.hThread) lRetValue = CloseHandle(pInfo.hProcess)
MsgBox "Calculator has terminated!" End Sub
|
|
« Последнее редактирование: 20-11-2007 18:12 от Алексей1153++ »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 24-10-2003 13:32 » |
|
Это из "HOWTO: Launch a Win32 Application from Visual Basic" Microsoft Knowledge Base Article - 129797 может поможет.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Пенсионер
Гость
|
|
« Ответ #7 : 27-10-2003 09:47 » |
|
2Джон Не допёр как это использовать
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 27-10-2003 10:58 » |
|
Сразу должен объяснить, я VB "плохо понимайт" . Просто в пятницу нечего было делать, вот и лез во все дырки, даже по Flash-у чёт советовал. Теперь по существу: Проблема заключается в том, что твой процесс бежит дальше после создания другого процесса (запуска программы - в твоём случае "Proga.exe"). Поэтому тебе надо твою прогу остановить до определённого момента. Но до какого? Создание процесса с помощью CrteateProcess() позволяте тебе получить доступ на хэндл (handle) этого процесса. Который можно "отслеживать" с помощью API функции WaitForSingleObject(); которая имеет два параметра. Прога стоит на месте вызова этой функции пока не произойдёт одно из след. событий: Хэндл (первый параметр = pi.hProcess) изменит своё состояние, а это происходит при завершении программы. Или закончится время указанное в качестве второго параметра. В данном случае INFINITE. После вызова этой функции можешь смело делать: Open App.Path & "\work.tmp" For Input As #1 Proga.exe - закончена. Только тебе надо врапер для WaitForSingleObject() типа как для CreateProcess().
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #9 : 27-10-2003 11:22 » |
|
Во чё нашёл! Всё что надо. Копируй и вперёд. Private Type STARTUPINFO 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
Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _ hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _ lpApplicationName As String, 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 String, _ 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& Private Const INFINITE = -1&
Public Function ExecCmd(cmdline$) Dim proc As PROCESS_INFORMATION Dim start As STARTUPINFO
' Initialize the STARTUPINFO structure: start.cb = Len(start)
' Start the shelled application: ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, vbNullString, 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& End Function
Sub Form_Click() Dim retval As Long retval = ExecCmd("notepad.exe") MsgBox "Process Finished, Exit Code " & retval End Sub
В функции Public Function ExecCmd(cmdline$) после ret& = WaitForSingleObject(proc.hProcess, INFINITE) можешь вызывать твои рутины (routines)
|
|
« Последнее редактирование: 20-11-2007 18:13 от Алексей1153++ »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #10 : 28-10-2003 06:28 » |
|
А можно попробовать и так :
...
Shell("CMD /c " & App.Path & "\Proga.exe" ) ' Запуск проги.
on error resume next 'по ошибке переходим на следующую команду
do while true Open App.Path & "\work.tmp" For Input As #1 'пробуем открыть файл if err.number = 0 then exit do ' если нет ошибки открытия то выходим endif loop
on error goto EH 'восстанавливаем обработчик ошибок
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
Пенсионер
Гость
|
|
« Ответ #11 : 29-10-2003 08:53 » |
|
2Джон Во!!! Круто!! А ка сделать чтоб он в скрытом режими ето делал!!!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 03-11-2003 08:39 » |
|
А что такое "скрытый режим"?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Пенсионер
Гость
|
|
« Ответ #13 : 03-11-2003 09:25 » |
|
Ну в смысле "hide".... чтоб процес выполнялся но его окно не показывалось.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 03-11-2003 09:46 » |
|
Ну... дык эт уже другая история. Можно например бит Visible на 0 поставить. Или как сервис запустить. Но как это в VB делается не знаю. Сорри
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|