Как запустить программу через 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы