Как запустить программу через CreateProcess со стилем по умолчанию? - VB

Узнай цену своей работы

Формулировка задачи:

Добрый вечер ! Подскажите, пожалуйста, данный код запускает калькулятор Windows. Внешний его вид выглядит как-то ущербно. Какие нужно задать атрибуты при запуске, чтобы он выглядел как другие стандартные приложения windows 7. Еще вопрос: lastDllError возвращает ERROR_NO_MORE_FILES (18). Это нормальный код возврата для CreateProcess ? Т.е., как я понимаю, обычно происходит поиск файла по путям PATH, и если находит, то выдается такая ошибка?
Листинг программы
  1. Option Explicit
  2. Private Type PROCESS_INFORMATION
  3. hProcess As Long
  4. hThread As Long
  5. dwProcessId As Long
  6. dwThreadId As Long
  7. End Type
  8. Private Type STARTUPINFO
  9. cb As Long
  10. lpReserved As Long
  11. lpDesktop As Long
  12. lpTitle As Long
  13. dwX As Long
  14. dwY As Long
  15. dwXSize As Long
  16. dwYSize As Long
  17. dwXCountChars As Long
  18. dwYCountChars As Long
  19. dwFillAttribute As Long
  20. dwFlags As Long
  21. wShowWindow As Integer
  22. cbReserved2 As Integer
  23. lpReserved2 As Byte
  24. hStdInput As Long
  25. hStdOutput As Long
  26. hStdError As Long
  27. End Type
  28. 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
  29. Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)
  30.  
  31. Private Const SW_SHOWNORMAL As Long = 1
  32. Private si As STARTUPINFO
  33. Private pi As PROCESS_INFORMATION
  34.  
  35. Private Sub Form_Load()
  36. Dim lr As Long
  37. lr = ProcessRun("c:\windows\system32\calc.exe") 'calc.exe
  38. End Sub
  39.  
  40. Public Function ProcessRun(Filename As String, Optional CommandLine As String, Optional WindowStyle As Long = SW_SHOWNORMAL)
  41. ' По-умолчанию стиль окна - SW_SHOWNORMAL
  42. Const STARTF_USESHOWWINDOW As Long = 1
  43. Const NORMAL_PRIORITY_CLASS As Long = &H20
  44. Dim n As Long
  45. Dim lr As Long
  46. Dim CmdLine As String
  47. Dim argc As Long
  48. Dim argv() As String
  49. CmdLine = """" & Filename & """" ' Имя файла в кавычки
  50. If CommandLine <> "" Then ' Если есть аргументы, их тоже добавляем в кавычках
  51. 'Parse_CMD CommandLine, argc, argv ' Вместо CommandLineToArgvW
  52. For n = 1 To argc
  53. CmdLine = CmdLine & " """ & argv(n) & """"
  54. Next
  55. End If
  56. si.cb = Len(si)
  57. GetStartupInfo si ' клонируем структуру текущего процесса
  58. si.dwFlags = STARTF_USESHOWWINDOW
  59. si.wShowWindow = WindowStyle ' Стиль окна
  60. lr = CreateProcess(vbNullString, _
  61. CmdLine, _
  62. ByVal 0, _
  63. ByVal 0, _
  64. False, _
  65. NORMAL_PRIORITY_CLASS, _
  66. ByVal 0, _
  67. vbNullString, _
  68. si, _
  69. pi)
  70.  
  71. Debug.Print Err.LastDllError ' not 0 is SUCCESS
  72. Stop
  73. ProcessRun = lr
  74. End Function

Решение задачи: «Как запустить программу через CreateProcess со стилем по умолчанию?»

textual
Листинг программы
  1. Public Function ProcessRun(Filename As String, Optional CommandLine As String, Optional WindowStyle As Long = SW_SHOWNORMAL)
  2.     ' По-умолчанию стиль окна - SW_SHOWNORMAL
  3.    
  4.     Const STARTF_USESHOWWINDOW      As Long = 1
  5.     Const NORMAL_PRIORITY_CLASS     As Long = &H20
  6.    
  7.     Dim n           As Long
  8.     Dim lr          As Long
  9.     Dim CmdLine     As String
  10.     Dim argc        As Long
  11.     Dim argv()      As String
  12.     Dim cl          As String
  13.     Dim cl_         As String
  14.    
  15.     CmdLine = """" & Filename & """"                    ' Имя файла в кавычки
  16.    
  17.     If CommandLine <> "" Then                           ' Если есть аргументы, их тоже добавляем в кавычках
  18.    
  19.         'Parse_CMD CommandLine, argc, argv               ' Вместо CommandLineToArgvW
  20.        For n = 1 To argc
  21.             CmdLine = CmdLine & " """ & argv(n) & """"
  22.         Next
  23.     End If
  24.    
  25.     si.cb = Len(si)
  26.     GetStartupInfo si                                   ' клонируем структуру текущего процесса
  27.    si.dwFlags = STARTF_USESHOWWINDOW
  28.     si.wShowWindow = WindowStyle                        ' Стиль окна
  29.    
  30.     ' Получаем режим совместимости
  31.    cl = Space(32767)
  32.     GetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl), 32767
  33.     cl = Left$(cl, InStr(1, cl, vbNullChar) - 1)
  34.     ' Создаем переменную окружения для нового процесса, тут можно включить также запуск от имени администратора
  35.    cl_ = Replace(cl, "DisableThemes", vbNullString)
  36.     SetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl_)
  37.    
  38.     lr = CreateProcess(vbNullString, _
  39.                        CmdLine, _
  40.                        ByVal 0, _
  41.                        ByVal 0, _
  42.                        False, _
  43.                        NORMAL_PRIORITY_CLASS, _
  44.                        ByVal 0, _
  45.                        vbNullString, _
  46.                        si, _
  47.                        pi)
  48.                        
  49.     ' Возвращаем на место
  50.    SetEnvironmentVariable StrPtr("__COMPAT_LAYER"), StrPtr(cl)
  51.    
  52.     Debug.Print Err.LastDllError    ' not 0 is SUCCESS
  53.    Stop
  54.    
  55.     ProcessRun = lr
  56. End Function

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


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

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

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы