CreateProccess не хочет запускать некоторый проги

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

CreateProccess не хочет запускать некоторый проги

Сообщение kirrun » 16.04.2006 (Вс) 19:10

Трабла следующая:

CreateProccess, как будто специально, не запускает виндовые проги (e.g. notepad.exe, regedit.exe). се остальные запускаются нормально.

т.е. никакой ошибки он не возвращает, все как-будто нормально, но процесс даже не пытается создаться...

Вот код:

Код: Выделить всё
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the Window(0)'s startup position
    sinfo.wShowWindow = SW_NORMAL
    'Set the priority class
    pclass = HIGH_PRIORITY_CLASS
   
    'Start the program
    If CreateProcess("C:\Windows\notepad.exe", vbNullString, sec1, sec2, False, pclass, 0&, App.Path, sinfo, pinfo) Then

'Для придирчивых: pinfo объявлена отдельно
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.04.2006 (Вс) 19:36

Код: Выделить всё
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES

Вовсе даже не needed. Можешь переобъявить эти параметры как ByVal As Long и передавать нули.

Может оказаться, что в этом и была проблема.
Изображение

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 17.04.2006 (Пн) 15:23

tyomitch, ну тот код писал не я =) Это был Ctrl+C, Ctrl+V из примера.
Но нифига не помогло.. Еще идеи?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.04.2006 (Пн) 17:19

Ээээ... Становится все чудесатее и чудесатее...

В общем, так. Наблюдаются глюки, если мы сразу (не присвоив его переменной) проверяем результат CreateProcess и НЕ обращаемся после этой проверки к мемберам структуры PROCESS_INFORMATION в условной конструкции If.

Работает, но через раз (!):
Код: Выделить всё
If CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo) Then
    Debug.Print "Hi!"
End If

Некрасиво, но работает:
Код: Выделить всё
If CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo) Then
    Debug.Print "Hi!", pInfo.dwProcessId
End If

Можно и рекомендуется:
Код: Выделить всё
Dim lRes As Long
lRes = CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo)
If lRes Then
    Debug.Print "Hi!"
End If
Моду создают модоки, а распространяют модозвоны.

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 17.04.2006 (Пн) 17:33

hCORe писал(а):Ээээ... Становится все чудесатее и чудесатее...

В общем, так. Наблюдаются глюки, если мы сразу (не присвоив его переменной) проверяем результат CreateProcess и НЕ обращаемся после этой проверки к мемберам структуры PROCESS_INFORMATION в условной конструкции If.

Работает, но через раз (!):
Код: Выделить всё
If CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo) Then
    Debug.Print "Hi!"
End If

Некрасиво, но работает:
Код: Выделить всё
If CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo) Then
    Debug.Print "Hi!", pInfo.dwProcessId
End If

Можно и рекомендуется:
Код: Выделить всё
Dim lRes As Long
lRes = CreateProcess("C:\Windows\system32\notepad.exe", vbNullString, sec1, sec2, ByVal 0&, pclass, ByVal 0&, vbNullString, sinfo, pinfo)
If lRes Then
    Debug.Print "Hi!"
End If


Дак проблема в том, что блокнот ВАЩЕ не запускается. Я твой код скопипастил - нифига. Или это тока у меня?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.04.2006 (Пн) 20:07

Странно... Вообще, глюки дикие. Такого не должно быть :shock:
Моду создают модоки, а распространяют модозвоны.

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 17.04.2006 (Пн) 21:35

блин. А у мя терь ваще ниче не запускается =)))

Гопода, как еще можно запустить ехешник чтобы получить hProcess (я так понимаю хендлер процесса) и dwThreadId

Судя по тому, что я видел в идеале юзать ShellExecute ибо тады можно будет не токак ехе запускать, но и другие файлы - это просто супер. но вот как достать хэндлер и идентификатор я хз...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Wild VB Code for Food
Постоялец
Постоялец
 
Сообщения: 387
Зарегистрирован: 16.06.2005 (Чт) 17:34
Откуда: ты, друг? =)) Сообщений: 1234

Сообщение Wild VB Code for Food » 18.04.2006 (Вт) 2:54

kirrun
Мммм...зачем мучатся? Shell тебе в помощь.....он возвращяет pid

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.04.2006 (Вт) 7:47

hCORe писал(а):Странно... Вообще, глюки дикие. Такого не должно быть :shock:


Только не говори что не работает...

Код: Выделить всё
Public 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

Public Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type

Public 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
Public Declare Function WaitForSingleObject Lib "kernel32" _
        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
        (ByVal lpApplicationName 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 String, _
        lpStartupInfo As STARTUPINFO, _
        lpProcessInformation As PROCESS_INFORMATION) As Long

' Запускает файл, возвращает True, если процесс создан успешено
' Параметры:    strCommandLine - командная строка
'               lngError       - номер ошибки
'               [varDebug]     - Если True, то создавать окно консоли
' Неконсольные программы запускаются только с varDebug = True :-(
Public Function StartFile(ByRef strCommandLine As String, _
        Optional ByRef bDebug As Boolean = False, _
        Optional ByRef strCurrentDirectory As Variant, _
        Optional ByRef hStdInput As Variant, _
        Optional ByRef hStdOutput As Variant, _
        Optional ByRef hStdError As Variant) As Long
    Const WAIT_FAILED = -1, INFINITE = -1, WAIT_TIMEOUT& = &H102&
    Const CREATE_NEW_CONSOLE = &H10, DETACHED_PROCESS = &H8
   
    Dim s As String, lngDebug As Long, lngError As Long, iWait As Long
    Dim lngStdInput As Long, lngStdOutput As Long, lngStdError As Long
    Dim usrPI As PROCESS_INFORMATION, usrSI As STARTUPINFO
   
    lngDebug = IIf(bDebug, CREATE_NEW_CONSOLE, DETACHED_PROCESS)
    usrSI.cb = Len(usrSI)
    If Not IsMissing(hStdInput) Then If hStdInput > 0 Then usrSI.hStdInput = hStdInput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdOutput) Then If hStdOutput > 0 Then usrSI.hStdOutput = hStdOutput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdError) Then If hStdError > 0 Then usrSI.hStdError = hStdError: usrSI.dwFlags = &H100
   
    If IsMissing(strCurrentDirectory) Then
        s = GetTempPath
    Else
        If Len(strCurrentDirectory) = 0 Then
            s = GetTempPath
        Else
            s = strCurrentDirectory
        End If
    End If
    If 1 = CreateProcess(0, strCommandLine, 0, 0, 1, _
            lngDebug, 0, s, usrSI, usrPI) Then
       
        iWait = WAIT_TIMEOUT
        Do
            iWait = WaitForSingleObject(usrPI.hProcess, 20)
            DoEvents
        Loop Until iWait <> WAIT_TIMEOUT
        If iWait = WAIT_FAILED Then
            CloseHandle usrPI.hProcess
            StartFile = -1
        Else
            GetExitCodeProcess usrPI.hProcess, lngError
            CloseHandle usrPI.hProcess
            If lngError <> 0 Then StartFile = lngError
        End If
    Else
        StartFile = -1
    End If
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 19.04.2006 (Ср) 21:41

Только не говори что не работает...

Код: Выделить всё
Private Sub Form_Load()
    StartFile "C:\Windows\notepad.exe", True
End Sub


не работает.

Аддед: да вообще ничего не запускает...
Мне уже кажется, что это только у меня...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.04.2006 (Чт) 7:47

kirrun писал(а):не работает.

Аддед: да вообще ничего не запускает...
Мне уже кажется, что это только у меня...


Я даже, кажется, знаю почему... :lol:

Нижеприведенный код запустит у тебя блокнотик:

Код: Выделить всё
Public 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

Public Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type

Private Declare Function GetSystemDirectoryA Lib "kernel32" (ByVal lpBuffer As String, ByVal nSize As Long) As Integer
Private Declare Function GetTempPathA Lib "kernel32" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public 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
Public Declare Function WaitForSingleObject Lib "kernel32" _
        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
        (ByVal lpApplicationName 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 String, _
        lpStartupInfo As STARTUPINFO, _
        lpProcessInformation As PROCESS_INFORMATION) As Long

Public Sub Main()
    Dim s As String
   
    s = GetSystemDirectory & "notepad.exe"
   
    Debug.Print StartFile(s)
End Sub

' Запускает файл, возвращает True, если процесс создан успешено
' Параметры:    strCommandLine - командная строка
'               lngError       - номер ошибки
'               [varDebug]     - Если True, то создавать окно консоли
' Неконсольные программы запускаются только с varDebug = True Sad
Public Function StartFile(ByRef strCommandLine As String, _
        Optional ByRef bDebug As Boolean = False, _
        Optional ByRef strCurrentDirectory As Variant, _
        Optional ByRef hStdInput As Variant, _
        Optional ByRef hStdOutput As Variant, _
        Optional ByRef hStdError As Variant) As Long
    Const WAIT_FAILED = -1, INFINITE = -1, WAIT_TIMEOUT& = &H102&
    Const CREATE_NEW_CONSOLE = &H10, DETACHED_PROCESS = &H8
   
    Dim s As String, lngDebug As Long, lngError As Long, iWait As Long
    Dim lngStdInput As Long, lngStdOutput As Long, lngStdError As Long
    Dim usrPI As PROCESS_INFORMATION, usrSI As STARTUPINFO
   
    lngDebug = IIf(bDebug, CREATE_NEW_CONSOLE, DETACHED_PROCESS)
    usrSI.cb = Len(usrSI)
    If Not IsMissing(hStdInput) Then If hStdInput > 0 Then usrSI.hStdInput = hStdInput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdOutput) Then If hStdOutput > 0 Then usrSI.hStdOutput = hStdOutput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdError) Then If hStdError > 0 Then usrSI.hStdError = hStdError: usrSI.dwFlags = &H100
   
    If IsMissing(strCurrentDirectory) Then
        s = GetTempPath
    Else
        If Len(strCurrentDirectory) = 0 Then
            s = GetTempPath
        Else
            s = strCurrentDirectory
        End If
    End If
    If 1 = CreateProcess(0, strCommandLine, 0, 0, 1, _
            lngDebug, 0, s, usrSI, usrPI) Then
       
        iWait = WAIT_TIMEOUT
        Do
            iWait = WaitForSingleObject(usrPI.hProcess, 20)
            DoEvents
        Loop Until iWait <> WAIT_TIMEOUT
        If iWait = WAIT_FAILED Then
            CloseHandle usrPI.hProcess
            StartFile = -1
        Else
            GetExitCodeProcess usrPI.hProcess, lngError
            CloseHandle usrPI.hProcess
            If lngError <> 0 Then StartFile = lngError
        End If
    Else
        StartFile = -1
    End If
End Function

Public Function GetTempPath() As String
    Dim s As String, i As Integer
    s = Space(100)
    i = GetTempPathA(100, s)
    GetTempPath = Left$(s, i)
End Function

Public Function GetSystemDirectory() As String
    Dim s As String, i As Long
   
    s = Space(100)
    i = GetSystemDirectoryA(s, Len(s))
    s = Left$(s, i)
    If Right$(s, 1) <> "" Then s = s & ""
    GetSystemDirectory = s
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Smert
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 07.04.2006 (Пт) 18:47
Откуда: Молдова,Бельцы

Сообщение Smert » 22.04.2006 (Сб) 20:44

Во вы мучаетесь!!! :shock:

Shell "C:\Windows\notepad.exe"

И попробуйте сказать что не работует!!! :twisted:

Ну или ЕСЛИ НЕ ПАШЕТ, то юзать WinExec()
Пап, а что такое ВБ?
Cынок, это просто фантастика!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 22.04.2006 (Сб) 20:49

Smert
А ShellExecute не подойдёт в таком случае?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Smert
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 07.04.2006 (Пт) 18:47
Откуда: Молдова,Бельцы

Сообщение Smert » 22.04.2006 (Сб) 20:49

У меня и блокнот, и регедит запускает, вот только плохо запускает Half-Life.exe, NFSU2.exe т.е. запускает, но не загружает толком все нужные файлы :cry: как если бы я кликал по этим екзешкам
Пап, а что такое ВБ?
Cынок, это просто фантастика!

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 23.04.2006 (Вс) 13:13

Smert
А ты попробуй задавать директорию перед запуском(если Shellom) или в самой функции (если апишками)
Если всё делать своими ручками, они скоро отвалятся !


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 100

    TopList