Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
1

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

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

Добрый день

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

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

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

C++ (Qt)
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2014, 20:42
Ответы с готовыми решениями:

Ошибка запуска приложения MSVCR100.dll
Доброго времени суток!Заранее прошу прощения за профессионализм.Суть проблемы...

Программа для предотвращения запуска определенных процессов во время работы приложения
Доброго времени суток. Я мало знаком с программированием в целом, и мне нужна...

CreateProcess не работает
Здравствуйте. Делаю программу, которая запускает внешнюю прогу. Инструментарий...

CreateProcess бездействие
Необходимо запустить другое приложение из проекта. Написал следующие ...

CreateProcess с совместимостью Win95 (програмно)
Странный, возможно кому-то покажется что даже идиотский вопрос: как програмно...

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

CreateProcess function
http://msdn.microsoft.com/en-us/libr...=vs.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
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
11.06.2014, 22:09  [ТС] 3
Я Вас понял, спасибо за уточнения, но у меня нет возможности ждать окончания выполнения исполняемого файла, продолжительность времени выполнения тоже неизвестна, кроме того исполняемых файлов несколько и они должны выполняться "одновременно".
Конечно можно сразу же вызывать GetExitCodeProcess после CreateProcess и возможно даже получить STILL_ACTIVE, но не уверен что по этому можно судить и том что код уже был загружен в адресное пространство процесса начал исполняться
0
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.06.2014, 22:47 4
Лучший ответ Сообщение было отмечено 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
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
11.06.2014, 22:52  [ТС] 5
Спасибо. Руссиновича уже начал читать
0
11.06.2014, 22:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 22:52

CreateProcess и SendMessage под Windows 10
Написал программку, которая запускает другую программу и посылает в нее...

Запуск приложения через CreateProcess(), передать параметры запуска, указать тот же каталог
Здравствуйте, помогите побороться с CreateProcess() Есть рабочая программа,...

CreateProcess: кроме запуска процесса запустить и само приложение
Добрый день подскажите как мне кроме запуска процесса запустить и само...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru