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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> File Mapping и дочерний процесс, передача дескрипторов в командной строке 
:(
    Опции темы
Аленка
Дата 17.12.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
У меня два вопроса  smile 

В родительском процессе делаю:
Код

hFile=CreateFile(...);
hFileMap = CreateFileMapping(...);
p = MapViewOfFile(...);

Создаю дочерний поток, в него  через командную строку передаю дескриптор hFile :
Код

wsprintf(comLine,"C:\\process2 %d", hFile);
CreateProcess(0,comLine,0,0,TRUE,0,0,0,&si,&pi);


Вопрос 1: Нужно ли передавать дескриптор объекта FileMapping? или в дочернем процессе объект FileMapping нужно создавать заново?

Вопрос 2: Можно ли как-то попасть в отладку дочернего процесса во время выполнения родительского?
PM   Вверх
Аленка
Дата 18.12.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Опытным путем выявлено  smile , что объект в дочернем процессе нужно создавать свой.
Вопрос 
Цитата

Вопрос 2: Можно ли как-то попасть в отладку дочернего процесса во время выполнения родительского?

 
остается...
PM   Вверх
W4FhLF
Дата 20.12.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Наверное имеются ввиду именованые участки. Создавай в родительском процессе именованый участок памяти(буду приводить примеры на ассемблере, но суть ясна):

invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE, 0, 07FFFFFh, $CT0("hunger.ru")
invoke MapViewOfFile, eax, FILE_MAP_WRITE + FILE_MAP_READ, 0, 0, 0

В дочернем открывай этот участок по имени:

invoke OpenFileMapping, FILE_MAP_WRITE+FILE_MAP_READ, FALSE, $CT0("hunger.ru")
invoke MapViewOfFile, eax, FILE_MAP_WRITE + FILE_MAP_READ, 0, 0, 0


Цитата

Вопрос 2: Можно ли как-то попасть в отладку дочернего процесса во время выполнения родительского?


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



Это сообщение отредактировал(а) W4FhLF - 20.12.2006, 14:45


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Аленка
Дата 21.12.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ой, спасибо!  smile 
Я бы поставила плюсик, но у меня прав не хватает...

OpenFileMapping() по имени в дочернем процессе- это намного проще, чем я пыталась делать. Не надо передавать дескриптор hFile(он нужен для создания FileMapping), и не нужно создавать новый FileMapping...Я догадывалась что все проще smile 

А попасть в отладку- это значит, мне нужно перейти в студии(Microsoft Visual Studio) на пошаговую отладку процесса(вверху он назван как process2), который я запускаю из родительского процесса функцией CreateProcess(). Это мое приложение, я могу его открыть в той же студии, запустить, но мне нужно попасть в него после вызова и посмотреть его некоторые переменные.
 

PM   Вверх
W4FhLF
Дата 21.12.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Ну можешь создать процесс с флагом CREATE_SUSPENDED, насильно прицепиться к нему и продолжить его выполнение функцией ResumeThread. Может быть есть и встроенные средства для этого, я увы не знаю, ибо встроенными средствами отладки не пользуюсь.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Аленка
Дата 21.12.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то не представляю, как это- прицепиться к SUSPENDED процессу? smile 

PM   Вверх
GremlinProg
Дата 22.12.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как отлаживаешь DLL, так отлаживай и  дочерний процесс. Командную строку установи на родительский процесс, только учти, путь до файла дочернего процесса должен быть таким же, как и путь до компилируемого в студии, иначе дебагер просто не схватит создание процесса.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Аленка
Дата 26.12.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ниче не поняла... smile 

В DLL- проекте я устанавливаю debug- версию,  и по f11 туда можно зайти, когда по шагам отлаживаешь проект, который использует эту dll.  
В дочерний процесс я не могу ТАК зайти...

Еще хотела добавить по поводу передачи дескрипторов в командной строке.

Вообщем, как я поняла, можно делать дочерний процесс наследующим все разрешенные к наследованию дескрипторы, и передавать интересующие через командную строку или еще как, для использования, тк дочерние процессы не имеют прямого доступа к наследуемым дескрипторам.
Или, если дескрипторы не наследуются, то можно пользоваться именем, которое задается функцией CreateFileMapping() в родительском процессе. Его тоже можно передать в командной строке.

НО! В одной книжке я прочитала что наследование все же предпочтительней. Т.к. возможны проблемы с уникальностью имен. Даже если другое приложение не создаст такого же имени, то проблемы будут при одновременной работе двух экземпляров приложения. Да и время на поиск имени затрачивается...

Вообщем, сначала я делала как правильно, а потом как удобнее smile 
PM   Вверх
W4FhLF
Дата 26.12.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Я даже знаю, что это была за книжка, Джеффри Рихтер "Windows для профессионалов" smile 

Ну тогда ты невнимательно читала:

Цитата

Главное отличие между вызовом Create- и Open-функций в том, что при отсутствии указанного объекта Create-функция создает его, а Open-функция просто уведомляет об ошибке.

Как я уже говорил, Microsoft ничего не сообщает о правилах именования объектов ядра Но представьте себе, что пользователь запускает две программы от разных компаний и каждая программа пытается создать объект с именем "MyObject". Ничего хорошего из этого не выйдет. Чтобы избежать такой ситуации, я бы посоветовал создавать GUID и использовать его строковое представление как имя объекта.


Время на поиск имени затрачивается может и больше, но на общем фоне ты это едва ли заметишь. К тому же, передача хэндлов через командную строку тоже не самый лучший в плане оптимизации вариант, для этого и были придуманы именованые объекты.

Это сообщение отредактировал(а) W4FhLF - 26.12.2006, 14:51


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Аленка
Дата 26.12.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм... у тебя ведь есть эта книжка в электронном виде? smile 

Я ее не нашла ни в каком...Поэтому у меня другая

И там тоже есть про программы, которые генерят это GUID. Но я решила что в учебном проекте правильней будет все же не заморачиваться на эти программы smile 
PM   Вверх
W4FhLF
Дата 26.12.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Есть в электронном, есть в бумажном... 
Побегайло... дал же Бог фамилию, не слышал об этом авторе. 
Послушай, не заморачивайся ты так на имени объекта, назови его MyEducationalApplication и я тебе обещаю, в системе не будет объектов, которые имеют такое же имя smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Аленка
Дата 26.12.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



офф:Поделись где книгу качал?

Обещаешь, говоришь? smile  а как быть с несколькими экземплярами приложения?
Хотя у меня задание не на проверку такой работы.  И то что нужно я уже сделала... smile 
PM   Вверх
W4FhLF
Дата 27.12.2006, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



офф: http://alexsoft.home.nov.ru/prog/index.htm

Чтобы контролировать кол-во запущенных приложений можешь использовать семафоры. В зависимости от числа свободных ресурсов в семафоре можно при соединять к имени создаваего объекта циферку, типа Object1 Object2 и т.д. Ну да ладно, разобралисьsmile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Аленка
Дата 27.12.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



W4FhLF, спасибо большое за книжку! Супер! И формат удобный... smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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