Как запустить программу через CreateProcess со стилем по умолчанию? - VB
Формулировка задачи:
Добрый вечер !
Подскажите, пожалуйста,
данный код запускает калькулятор Windows.
Внешний его вид выглядит как-то ущербно.
Какие нужно задать атрибуты при запуске, чтобы он выглядел как другие стандартные приложения windows 7.
Еще вопрос: lastDllError возвращает ERROR_NO_MORE_FILES (18).
Это нормальный код возврата для CreateProcess ?
Т.е., как я понимаю, обычно происходит поиск файла по путям PATH,
и если находит, то выдается такая ошибка?
Решение задачи: «Как запустить программу через 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