Как запустить программу через CreateProcess со стилем по умолчанию? - VB
Формулировка задачи:
Добрый вечер !
Подскажите, пожалуйста,
данный код запускает калькулятор Windows.
Внешний его вид выглядит как-то ущербно.
Какие нужно задать атрибуты при запуске, чтобы он выглядел как другие стандартные приложения windows 7.
Еще вопрос: lastDllError возвращает ERROR_NO_MORE_FILES (18).
Это нормальный код возврата для CreateProcess ?
Т.е., как я понимаю, обычно происходит поиск файла по путям PATH,
и если находит, то выдается такая ошибка?
Листинг программы
- 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 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 Byte
- 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 Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)
- Private Const SW_SHOWNORMAL As Long = 1
- Private si As STARTUPINFO
- Private pi As PROCESS_INFORMATION
- Private Sub Form_Load()
- Dim lr As Long
- lr = ProcessRun("c:\windows\system32\calc.exe") 'calc.exe
- End Sub
- Public Function ProcessRun(Filename As String, Optional CommandLine As String, Optional WindowStyle As Long = SW_SHOWNORMAL)
- ' По-умолчанию стиль окна - SW_SHOWNORMAL
- Const STARTF_USESHOWWINDOW As Long = 1
- Const NORMAL_PRIORITY_CLASS As Long = &H20
- Dim n As Long
- Dim lr As Long
- Dim CmdLine As String
- Dim argc As Long
- Dim argv() As String
- CmdLine = """" & Filename & """" ' Имя файла в кавычки
- If CommandLine <> "" Then ' Если есть аргументы, их тоже добавляем в кавычках
- 'Parse_CMD CommandLine, argc, argv ' Вместо CommandLineToArgvW
- For n = 1 To argc
- CmdLine = CmdLine & " """ & argv(n) & """"
- Next
- End If
- si.cb = Len(si)
- GetStartupInfo si ' клонируем структуру текущего процесса
- si.dwFlags = STARTF_USESHOWWINDOW
- si.wShowWindow = WindowStyle ' Стиль окна
- lr = CreateProcess(vbNullString, _
- CmdLine, _
- ByVal 0, _
- ByVal 0, _
- False, _
- NORMAL_PRIORITY_CLASS, _
- ByVal 0, _
- vbNullString, _
- si, _
- pi)
- Debug.Print Err.LastDllError ' not 0 is SUCCESS
- Stop
- ProcessRun = lr
- End Function
Решение задачи: «Как запустить программу через CreateProcess со стилем по умолчанию?»
textual
Листинг программы
- Public Function ProcessRun(Filename As String, Optional CommandLine As String, Optional WindowStyle As Long = SW_SHOWNORMAL)
- ' По-умолчанию стиль окна - SW_SHOWNORMAL
- Const STARTF_USESHOWWINDOW As Long = 1
- Const NORMAL_PRIORITY_CLASS As Long = &H20
- Dim n As Long
- Dim lr As Long
- Dim CmdLine As String
- Dim argc As Long
- Dim argv() As String
- Dim cl As String
- Dim cl_ As String
- CmdLine = """" & Filename & """" ' Имя файла в кавычки
- If CommandLine <> "" Then ' Если есть аргументы, их тоже добавляем в кавычках
- 'Parse_CMD CommandLine, argc, argv ' Вместо CommandLineToArgvW
- For n = 1 To argc
- CmdLine = CmdLine & " """ & argv(n) & """"
- Next
- End If
- si.cb = Len(si)
- GetStartupInfo si ' клонируем структуру текущего процесса
- si.dwFlags = STARTF_USESHOWWINDOW
- si.wShowWindow = WindowStyle ' Стиль окна
- ' Получаем режим совместимости
- cl = Space(32767)
- GetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl), 32767
- cl = Left$(cl, InStr(1, cl, vbNullChar) - 1)
- ' Создаем переменную окружения для нового процесса, тут можно включить также запуск от имени администратора
- cl_ = Replace(cl, "DisableThemes", vbNullString)
- SetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl_)
- lr = CreateProcess(vbNullString, _
- CmdLine, _
- ByVal 0, _
- ByVal 0, _
- False, _
- NORMAL_PRIORITY_CLASS, _
- ByVal 0, _
- vbNullString, _
- si, _
- pi)
- ' Возвращаем на место
- SetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl)
- Debug.Print Err.LastDllError ' not 0 is SUCCESS
- Stop
- ProcessRun = lr
- End Function
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д