Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как?  (Прочитано 16533 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Пенсионер
Гость
« : 23-10-2003 15:08 » 

Как решить задачу?
Необходимо вначале выполнить прогу которая создаст файл
А потом загрузить результат файла? Делую так:

Shell "CMD /c " & App.Path & "\Proga.exe"
Open App.Path & "\work.tmp" For Input As #1
...

Но файл не успевает создатся....
как поставить задержку на время пока выполняется "Proga.exe"?
Записан
HandKot
Молодой специалист

ru
Offline 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(((
Записан
Джон
просто
Администратор

de
Offline 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 » 

Ух.....
Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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Джон
Не допёр как это использовать
Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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
Молодой специалист

ru
Offline 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Джон
Во!!! Круто!! А ка сделать чтоб он в скрытом режими ето делал!!!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 03-11-2003 08:39 » new

А что такое "скрытый режим"?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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"....
чтоб процес выполнялся но его окно не показывалось.
Записан
Джон
просто
Администратор

de
Offline 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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines