Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateProcess 
V
    Опции темы
bass
Дата 6.1.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Такая ситуация запускаю процесс через CreateProcess.... А процесс просто файл забытый ноликами.. CreateProcess. возвращает труе может кто нить объяснить что нибудь по  этому поводу..
PM MAIL   Вверх
Dem_max
Дата 6.1.2012, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



даже и не вериться


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 6.1.2012, 16:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(bass @  6.1.2012,  14:13 Найти цитируемый пост)
А процесс просто файл забытый ноликами.. CreateProcess. возвращает труе может кто нить объяснить что нибудь по  этому поводу.. 

Все просто. Смотрим описание CreateProcess :

Цитата

Return value

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. To get the termination status of a process, call GetExitCodeProcess. 

Смотрим, что такое 'файл, забитый ноликами'. Т.к. сигнатуры PE в нем нет, то он будет отдан подсистеме MS-DOS, которая успешно запустится, в знак чего CreateProcess и вернет TRUE. Далее подсистема MS-DOS определит, что это не exe файл (по отсутствию сигнатуры MZ в начале файла), и запустит его как .com файл. А нули - это вполне валидная x86 команда  smile 

PM MAIL   Вверх
feodorv
Дата 6.1.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(xvr @  6.1.2012,  16:30 Найти цитируемый пост)
Смотрим, что такое 'файл, забитый ноликами'. Т.к. сигнатуры PE в нем нет, то он будет отдан подсистеме MS-DOS, которая успешно запустится, в знак чего CreateProcess и вернет TRUE. Далее подсистема MS-DOS определит, что это не exe файл (по отсутствию сигнатуры MZ в начале файла), и запустит его как .com файл. А нули - это вполне валидная x86 команда

Позволю себе не согласиться. Чтобы запустить MS-DOS просесс, нужно указать специальный флаг CREATE_FORCEDOS. Чтобы запустить com-приложение, нужно, чтобы у запускаемого файла было расширение  .com.

Я решал подобную проблему через WaitForInputIdle:
Цитата

The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process. 

вкупе с GetExitCodeProcess.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 6.1.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



feodorv

Цитата

Позволю себе не согласиться. Чтобы запустить MS-DOS просесс, нужно указать специальный флаг CREATE_FORCEDOS. Чтобы запустить com-приложение, нужно, чтобы у запускаемого файла было расширение  .com.


Только почему тогда труе возвращается????


PM MAIL   Вверх
xvr
Дата 6.1.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(feodorv @ 6.1.2012,  18:03)
Позволю себе не согласиться. Чтобы запустить MS-DOS просесс, нужно указать специальный флаг CREATE_FORCEDOS. 


Не обязательно. Dos процесс и так определится. Force нужен что бы отключить автоматическое определение
Цитата


Чтобы запустить com-приложение, нужно, чтобы у запускаемого файла было расширение  .com.

Это не так уже со времен первых версий Windows. Exe отделяется от com исключительно по сигнатуре в файле

PM MAIL   Вверх
feodorv
Дата 6.1.2012, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(bass @  6.1.2012,  22:39 Найти цитируемый пост)
Только почему тогда труе возвращается????

Нет, всё же я не прав в отношении флага CREATE_FORCEDOS. Он нужен, когда хочется запустить 16-битный батник. 

Воспроизвёл ситуацию на Windows Server 2003. Вернулось TRUE. Но при этом выскочило окошко "ntvdm.exe- System Error" с надписью "NTVDM encountered a hard error"....

TRUE возвращается потому, что корректно создаётся процесс ntvdm.exe, и CreateProcess не волнует, что там далее. А далее уже ntvdm.exe не может выполнить тупой файл...

Это сообщение отредактировал(а) feodorv - 6.1.2012, 23:39


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.