Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55

CreateProcess. Признак успешного запуска приложения

11.06.2014, 20:42. Показов 2719. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

В MSDN указано что CreateProcess возвращает ненулевое значение если запуск произошел удачно.
На практике оказалось что возвращаемое ненулевое значение не гаранитирует что приложение было удачно запущено. Например, если создать файл hello.exe и записать в него строчку "Hello World", то CreateProcess вернет ненулевое значение, т.е. "все нормально".
Очевидно что в случае "битого" и "целого" exe-файла будет создан процесс, главный поток, но непонятно корректно ли загружен образ исполняемого файла в процесс и поток.

Как можно установить удачно ли было запущено приложение?

Пользовался этим кодом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    memset(&si,0,sizeof(si)); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_HIDE; 
    
    Logw(USER_STREAM , L"\nstarting '%s'" , filepath);
 
    if(CreateProcess(filepath , params , NULL , NULL, FALSE , CREATE_NEW_CONSOLE , NULL , NULL , &si , &pi) == TRUE)
    { 
        Logw(USER_STREAM , L"\tCreateProcess '%s' [OK]" , filepath);    
        Log(USER_STREAM , "\ndwProcessId=%d" , pi.dwProcessId);
        Log(USER_STREAM , "\ndwThreadId=%d" , pi.dwThreadId);
    }else
    {
        Logw(USER_STREAM , L"\tCreateProcess '%s' [ERROR]" , filepath); 
        Log(USER_STREAM , "\ndwProcessId=%d" , pi.dwProcessId);
        Log(USER_STREAM , "\ndwThreadId=%d" , pi.dwThreadId);
        return ERROR;
    }
    return OK;
Спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2014, 20:42
Ответы с готовыми решениями:

Не работает признак окончания ввода(признак-0)
Признак окончания ввода 0; подскажите люди добрые что не так?) #include <iostream>...

Как в CreateProcess задать параметры запуска процесса ?
Код работает , но как задать параметры запуска steam т.е. в консоли бы написал так...

Программа, считывающая диапазон и выдающая «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора
Здравствуйте! Недавно начал изучать Visual C++ и пока не получается сделать программу, а очень...

4
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.06.2014, 21:29
Цитата Сообщение от hknower Посмотреть сообщение
В MSDN указано что CreateProcess возвращает ненулевое значение если запуск произошел удачно.
Нет, в MSDN сказано иное:

CreateProcess function
http://msdn.microsoft.com/en-u... 85%29.aspx
If the function succeeds, the return value is nonzero.
Ни слова по поводу запуска.

А вот что сказано ниже:
Note that the function returns before the process has finished initialization.
If a required DLL cannot be located or fails to initialize, the process is terminated.
Цитата Сообщение от hknower Посмотреть сообщение
но непонятно корректно ли загружен образ исполняемого файла в процесс и поток.
Поправка, для точности - исполняемый образ загружается в адресное
пространство процесса. Не потока.

Цитата Сообщение от hknower Посмотреть сообщение
Как можно установить удачно ли было запущено приложение?
Можно дождаться завершения процесса (wait-функция на его хэндле), а
затем позвать GetExitCodeProcess. При нормальном завершении там будет 0
или какой-нибудь стандартный код ошибки типа EXIT_FAILURE (1) и т.п.
При сбое на стадии запуска обычно получается нечто другое. Например,
hello.exe, собранный по рецепту выше, при у меня завершился с кодом 216 (ERROR_EXE_MACHINE_TYPE_MISMATCH).

Но это следует рассматривать, как частный случай, хотя все "правильные"
программы завершаются с "правильными" кодами.
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
11.06.2014, 22:09  [ТС]
Я Вас понял, спасибо за уточнения, но у меня нет возможности ждать окончания выполнения исполняемого файла, продолжительность времени выполнения тоже неизвестна, кроме того исполняемых файлов несколько и они должны выполняться "одновременно".
Конечно можно сразу же вызывать GetExitCodeProcess после CreateProcess и возможно даже получить STILL_ACTIVE, но не уверен что по этому можно судить и том что код уже был загружен в адресное пространство процесса начал исполняться
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.06.2014, 22:47
Лучший ответ Сообщение было отмечено hknower как решение

Решение

Цитата Сообщение от hknower Посмотреть сообщение
но не уверен что по этому можно судить и том что код уже был загружен в адресное пространство процесса начал исполняться
Образ exe, а также образ ntdll.dll, загружаются в адресное пространство
нового процесса в первую очередь, и происходит это еще до выхода из
CreateProcess. Если это важно, там же, внутри вызова CreateProcess,
дергаются специальные нотификаторы ядра о создании нового процесса и
его первичного потока. Если PE-образ exe неверный, или несовместим с
текущей платформой, или система по каким-то причинам не может
загрузить в него exe/ntdll.dll - CreateProcess будет возвращать FALSE.

То есть, возврат CreateProcess ненулевого значения можно трактовать,
как успешный старт приложения, то есть, что был создан новый объект-
процесс, для него было создано адресное пространство, в него загружен
образ exe и ntdll.dll и в этом адресном пространстве был запущен
первичный поток (из ntdll!LdrInitializeThunk).

Ну а дальше первичный поток нового процесса начинает загружать
зависимые dll-ки, выполняя их DllMain, а затем переходит на точку
входа самого exe - все это уже за пределами CreateProcess.
Хотя и на этой стадии можно ловить какой-нибудь exit code 0xC0000135
(dll not found).

В общем, резюмируя - я бы посоветовал почитать Руссиновича, главу про
создание процесса (в деталях), там может какую-то зацепку и найдете.
Если копать еще глубже, тогда WRK (+NT4/Win2K) + WinDbg в руки и вперед
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
11.06.2014, 22:52  [ТС]
Спасибо. Руссиновича уже начал читать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2014, 22:52
Помогаю со студенческими работами здесь

Каков порядок изучения тем для более успешного освоения языка
Добрый день, программисты. Хочу посоветоваться у вас вот по какому вопросу, но сначала скажу...

Как в cbuilder вытащить данные из успешного sql запроса?
Добрый день, такая ситуация, выполнил запрос, и нужно вытащить в мемо записи. Интересуют 2...

Трудоустройство: что нужно знать для успешного прохождения собеседования в самые крутые компании?
Добрый вечер. Напишите пожалуйста список того, что нужно знать для успешного прохождения...

Грамотное завершение успешного обмена
Добрый день, подскажите пожалуйста, кто должен завершать успешный обмен данными между клиентом и...

Вычислить минимальное количество значков, которое необходимо подготовить для успешного проведения игры
Помогите, пожалуйста решить задачу. Вася готовит инвентарь для ролевой игры. В игре должны принять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru