Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateProcess & Windows98, Запуск приложений используя CreateProces 
:(
    Опции темы
Fon
Дата 17.11.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.7.2005

Репутация: нет
Всего: нет



Доброе время суток.
Подскажите, может кто-то с чем-то подобным сталкивался:
нужно запустить консольное приложение используя CreateProcess. Приложение должно работать в фоновом режиме, т.е.
кронсоль после запуска не должна появляться, также нужно отследить окончание его работы. Вот код который я использую для реализации этого:

Код

Private Type STARTUPINFO
   cb As Long
   lpReserved As Long
   lpDesktop As Long
   lpTitle As Long
   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 Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Const STARTF_USESHOWWINDOW = &H1
Private Const INFINITE = &HFFFF ' Infinite timeout
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum

Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
         lpApplicationName As String, ByVal lpCommandLine As String, _
         lpProcessAttributes As Any, lpThreadAttributes As Any, _
         ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
         ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
         lpStartupInfo As Any, lpProcessInformation As Any) As Long

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


' процедура из которой происходит вызов
Private Sub cmdLoad_Click()
    Dim pi As PROCESS_INFORMATION
    Dim si As STARTUPINFO
    With si
        .cb = Len(si)
        .dwFlags = STARTF_USESHOWWINDOW
        .wShowWindow = SW_HIDE
    End With
    ... 
    If CreateProcessA(vbNullString, cmdline$, 0&, 0&, 0&, 0, 0&, 0&, si, pi) <> 0 Then

        WaitForSingleObject pi.hProcess, INFINITE
        CloseHandle pi.hProcess
        
    Else
        ....
    End If

End Sub



Все хорошо работает под Win2000, WinXP но отказывается работать под Win98 - CreateProcess вызвращает 0
соответственно процесс не может создаться...

Всем спасибо.
PM MAIL   Вверх
Kergan
Дата 17.11.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



GetLastError что выдает?
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
Fon
Дата 17.11.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.7.2005

Репутация: нет
Всего: нет



Добавил в код вызов GetLastError
Код

    If CreateProcessA(vbNullString, cmdline$, 0&, 0&, 0&, 0, 0&, 0&, si, pi) <> 0 Then
        
        WaitForSingleObject pi.hProcess, INFINITE
        CloseHandle pi.hProcess
        
    Else
      
        Dim Buffer As String
        Buffer = Space(200)
        FormatMessage FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, LANG_NEUTRAL, Buffer, 200, ByVal 0&
        
        MsgBox Buffer
    End If


GetLastError возвращает, что все ОК
The operation completed successfully!!!

Но, вот парадокс CreateProcessA не выполняется, возвращает 0, соответственно ничего не происходит!

Возможно дело в запускаемом приложении...
Я запускаю osql для выполнения скрипта на сервере.
Вот примерный вид строки

Код

cmdline = "c:\osql.exe -U sa -S . -d master -i c:\1.sql -o c:\1.txt -w 5000 -n -P 1"


Что не так, не пойму...
PM MAIL   Вверх
Kergan
Дата 18.11.2005, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



Оригинально... А с другими приложениями пробовал? С чем-нибудь простеньким - cmd.exe, блокнот, калькулятор...
PS А почему именно CreateProcess? можно Shell или ShellExecute?
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
Fon
Дата 18.11.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.7.2005

Репутация: нет
Всего: нет



С другими тоже пробовал, не получается........,
причем пробовал на разных компюьтерах с 98 виндой......
CreateProcess потому что, мне нужно скрыть окно и отследить
завершение работы запускаемой программы.

Это сообщение отредактировал(а) Fon - 18.11.2005, 10:18
PM MAIL   Вверх
Kergan
Дата 18.11.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



Будем пробовать ShellExecute...
Там последний параметр - как отображать окно программы, его делаешь SW_HIDE.
\Поэксперементируй!\
Ну, по поводу ожидания завершения - этот фокус можно с любым процессом проделать - получить его хэндл при помощи
OpenProcess
Эта функция потребует идентификатор PID процесса - его тоже получить несложно при помощи функций toolhelp (перечисления процессов).
и потом, как ты и написал,
WaitForSingleObject
Если нужно подробнее, пиши.
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
Kergan
Дата 18.11.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



Код

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long    
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long    
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long  
Const INFINITE = &HFFFF          
Const SYNCHRONIZE = &H100000 


dim PID as long
dim hproc as long
'Запускаем в скрытом режиме программу, PUT_K_PROGRAMME - строка пути к файлу с прогой
PID = shell(PUT_K_PROGRAMME, vbHide)
'Получаем хэндл по идентификатору
hproc = OpenProcess(SYNCHRONIZE, 0, PID)
'Если хэндл получен, ждем-с завершения процесса!
    If hProcess <> 0 Then    
        Call WaitForSingleObject(hProc, INFINITE)    
'Закрываем хэндл
        Call CloseHandle(hProc)    
    End If 


Вот, что-то типа этого...

Это сообщение отредактировал(а) Kergan - 18.11.2005, 12:45
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
Fon
Дата 18.11.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 9.7.2005

Репутация: нет
Всего: нет



О, супер, спасибо!!!
Кажеться в таком варианте все работает!

Слушай, правда, я почитал МСДН и у меня возник еще один вопрос по теме:
при описании ф-ции OpenProcess описываются значения парамметра dwDesiredAccess.
В нашем случае используется SYNCHRONIZE, т.к. нам нужно будет
отслеживать окончание работы программы.
Вопрос в следующем: при описании SYNCHRONIZE около него
стоит метка "Windows NT/2000", не будет ли это означать, что такое
значение dwDesiredAccess не поддерживается Вин98?


Это сообщение отредактировал(а) Fon - 18.11.2005, 15:49
PM MAIL   Вверх
Kergan
Дата 18.11.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 20.8.2005

Репутация: 3
Всего: 5



Открой с приоритетом не SYNCHRONIZE, а PROCESS_ALL_ACCESS... если винда даст... Это даст тебе ПОЛНЫЙ контроль над процессом. виндовоз 98 не должен возмущаться, если есть права админа.
PS вот пример, тестированный в 2000 и XP (там прямо внутри код)
Извлекаешь оба exe-файла в одну диру, запускаешь PR1.exe, он запускает PR2.exe (там на форме будет написано "Закрой это окно"), потом сообщение о том, что окно открылось + идентификатор процесса PR2. Закрой PR2 и будет сообщение о закрытии ОТ PR1. До того, как ты закроешь PR2, PR1 будет недоступна (курсорчик часами).

Это сообщение отредактировал(а) Kergan - 18.11.2005, 16:26

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  PR1.rar 5,39 Kb
--------------------
Была у меня дурацкая подпись...Я ее убрал, а новую еще не придумал. :(
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.