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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследования дескрипторов, определить HANDLE 
:(
    Опции темы
Router
Дата 17.8.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почитал я MSDN и поискал здесь на форуме, но так и не нашел ответ для себя.

Суть вот в чем:
В главном процессе создаются не именованные каналы
с возможностью наследования, и запускаются новые процессы,
наследуя созданные дескрипторы.

Как известно HANDLE хранит номер в специальной таблице дескрипторов.
При наследовании дескрипторов процесса, в новом процессе
достаточно знать это номер, чтобы использовать объект.

В MSDN написано:
Цитата

To use a handle, the child process must retrieve the handle value and "know" the object to which it refers. Usually, the parent process communicates this information to the child process through its command line, environment block, or some form of interprocess communication.

Меня интересует как узнать этот номер в дочерним процессе,
не используя командную строку, и если как то это возможно 
без других средств IPC(interprocess communication)?

Есть Метод с помощью STARTUPINFO, но мне не известно как дочерние приложение
использует поля из этой структуры, поэтому дочерние приложения может выполнится не корректно.
Хотя может вы знаете куда там засунуть HANDLE чтобы не повлиять на создаваемый процесс?

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


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


Шустрый
*


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

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



Ищи книгу Джеффри Рихтера "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows".
В главе 3 этой книги все хорошо расписано:

Глава 3 Объекты ядра
     ...
     Таблица описателей объектов ядра
     ...
     Совместное использование объектов ядра несколькими процессами
     Наследование описателей объекта

Лучшего описания темы (да и вообще другого) нигде не встречал.

Это сообщение отредактировал(а) casey - 18.8.2010, 09:28
PM MAIL WWW   Вверх
Router
Дата 18.8.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, освежил в памяти и что то стало более понятным, но проблема осталась.

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

Таким образом мне проще передать не дескриптор а данные.

Заинтересовало environment block.
Дайте пожалуйста статейку, где описаны его возможности,
и какова гарантия уникальности моей переменной?

Взглянул на проблему с другой стороны.
Есть два потока А и В. Поток А владеет обоими. Как передать данные из потока А в поток В?
Потоки А и В находятся в разных процессах.

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


Эксперт
****


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

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



Цитата(Router @  18.8.2010,  11:06 Найти цитируемый пост)
Таким образом мне проще передать не дескриптор а данные.
Если данные передаются только в одну сторону и уместятся в размер дескриптора - то конечно проще передать сразу данные.

Цитата(Router @  18.8.2010,  11:06 Найти цитируемый пост)
и какова гарантия уникальности моей переменной?
Никаких гарантий. С другой стороны, если 2й процесс ваш и вы точно знаете, какие переменные окружения ему нужны, то можно смело добавить сколько надо переменных окружения с другими именами. И если они случайно совпадут с уже существующими переменными окружения ничего страшного не произойдет - они все равно остальному процессу не были нужны.

Цитата(Router @  18.8.2010,  11:06 Найти цитируемый пост)
Взглянул на проблему с другой стороны.
Есть два потока А и В. Поток А владеет обоими. Как передать данные из потока А в поток В?
Потоки А и В находятся в разных процессах.
Это все та же сторона - первично то, что A и B в разных процессах. Потоки тут уже совершенно не при чем.


PM MAIL   Вверх
Router
Дата 18.8.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Таким образом мне нельзя изменять то что может понадобится создаваемому процессу.


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


Эксперт
****


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

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



Цитата(Router @  18.8.2010,  11:51 Найти цитируемый пост)
Второй процесс не мой, я в него внедряю библиотеку.
В эту библиотеку мне нужно передать небольшой объем данных.
В функции DllMain мне надо получить данные от главного приложения.
Сделай разделяемую секцию в dll (см http://msdn.microsoft.com/en-us/library/h9...28VS.80%29.aspx ) и слинкуй свое приложение с ней (и ее же внедряй в второй процесс). Тогда данные можно будет спокойно сложить в массив в этой секции dll'ля у себя, и прочесть их потом во 2м процессе


PM MAIL   Вверх
Router
Дата 19.8.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет я такой метод исключил.

Я почитал masm.ru, раздел Секреты WIN32 и придумал для своего варианта идеальный способ.

1. Я выделяю память для внедрения библиотеки, так же я записал туда и данные.
2. В самой библиотеке я написал функцию которая копирует данные, в главный массив, из переданного адреса. Функция является экспортированной.
3. В шел коде я загружаю библиотеку, получаю адрес функции, и вызываю ее с адресом к данным.

и наконец запускаю приложение.


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


Эксперт
****


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

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



Цитата(Router @  19.8.2010,  12:08 Найти цитируемый пост)
придумал для своего варианта идеальный способ.
Тоже вариант. Особенно если образ библиотеки грузится вручную, а не через LoadLibrary


PM MAIL   Вверх
Router
Дата 19.8.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я во внедряемом коде использую как раз функции загрузки и получения адреса функции.

А тебя я не понял, какие плюсы в том что бы грузить в ручную.
И я не знаю как это грузить в ручную. 
PM MAIL   Вверх
xvr
Дата 20.8.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Router @  19.8.2010,  12:42 Найти цитируемый пост)
А тебя я не понял, какие плюсы в том что бы грузить в ручную.
Плюсов никаких, но иногда по другому просто не получится
Цитата

И я не знаю как это грузить в ручную.  
Это выделить память и откопировать туда содержимое исполняемого образа, которое может быть получено разными путями - начиная от прямой копии из своего собственного кода, и кончая разбором PE файла с dll.
А не вручную - это позвать LoadLibrary("dll_name.dll")

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.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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