Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен данными между процессами [D7, Win95/98, WinXP]


Страницы:   1 2

zero ©   (2007-03-26 14:36:00) 

У меня есть две программы, одна из программ запускает другую использую для этих целей функцию ShellExecute, у меня два вопроса
1. Допустим я запустил программу, как мне узнать, в программе из которой я запускаю программу, что запущенная программа закрылась после того как выполнила свои дейвствия ?

2. Как узнать из какой программы была запущена программа ?

Надо чтоб работало и под Win98, WinNT, Win2000 и WinXP


SLoW.AlfaMoon.Com   (2007-04-05 11:43:00) [1]

Смотрите это сообщение
GrayFace ©   (29.03.07 18:11) [19]


Riply   (2007-04-04 11:30:00) [2]

> [20] SLoW.AlfaMoon.Com   (30.03.07 10:09)
> (угадайте!) 33.
Ни как не пойму: а причем здесь сравнение хэндлов ?
Разговор шел о том, что "PID процесса однозначно оный идентифицирует, если
хоть один хендл процесса удерживается открытым"
PID - надо сравнивать


SLoW.AlfaMoon.Com   (2007-04-02 15:59:00) [3]

Ты просто сделал CloseHandle и он стал недействительным.
Причем тут это? В тестовой программе CloseHandle я не делал.
Блокнот закрывался щелчком по крестику X


GrayFace   (2007-04-02 13:42:00) [4]

SLoW.AlfaMoon.Com   (30.03.07 10:09) [20]
> Это не совсем так. Дело в том, что хэндлов мало, а потребность
> в них большая.
> Только что написал тестовую программку с одной кнопкой,
> которая запускает блокнот и сохраняет его хэндл. Значение
> хэндла было 33. После чего я закрыл блокнот и снова нажал
> на кнопку в тестовой программе. Значение хэндла запущенного
> вновь блокнота было (угадайте!) 33.

Ты просто сделал CloseHandle и он стал недействительным.


Ketmar   (2007-03-30 12:26:00) [5]

pipes -- наше всё. на этом же сайте есть пример от ИШ. я лично юзал. %-))


SLoW.AlfaMoon.Com   (2007-03-30 10:09:00) [6]

GrayFace ©   (29.03.07 18:11) [19]

SLoW.AlfaMoon.Com   (28.03.07 17:12) [16]
Я, разумеется, имел в виду, что ПИД и Хэндл по отдельности не идентифицируют.
Хэндл без привличения PID тоже идентифицирует. В рамках приложения он, естественно, уникален, а другим процессам можно передать через DuplicateHandle.


Это не совсем так. Дело в том, что хэндлов мало, а потребность в них большая.
Только что написал тестовую программку с одной кнопкой, которая запускает блокнот и сохраняет его хэндл. Значение хэндла было 33. После чего я закрыл блокнот и снова нажал на кнопку в тестовой программе. Значение хэндла запущенного вновь блокнота было (угадайте!) 33.


GrayFace   (2007-03-29 18:11:00) [7]

SLoW.AlfaMoon.Com   (28.03.07 17:12) [16]
Я, разумеется, имел в виду, что ПИД и Хэндл по отдельности не идентифицируют.

Хэндл без привличения PID тоже идентифицирует. В рамках приложения он, естественно, уникален, а другим процессам можно передать через DuplicateHandle.


SLoW.AlfaMoon.Com   (2007-03-29 10:01:00) [8]

Leonid Troyanovsky ©   (28.03.07 17:44) [17]


Ничего не могу сказать по поводу этого утверждения. Нaдо смотреть wrk


Leonid Troyanovsky   (2007-03-28 17:44:00) [9]


> SLoW.AlfaMoon.Com   (28.03.07 17:12) [16]

>  совершенно независимо от наличия открытых хэндлов. Отладочным
> методом, например.

Ну, а pid не будет утилизирован, пока есть открытые хендлы.

--
Regards, LVT.


SLoW.AlfaMoon.Com   (2007-03-28 17:12:00) [10]

Kedge
Я, разумеется, имел в виду, что ПИД и Хэндл по отдельностине идентифицируют.
Насчет комбинации, предложенной Leonid Troyanovsky, ничего не скажу, ибо не пробовал. Однако, процесс может быть прибит, совершенно независимо от наличия открытых хэндлов. Отладочным методом, например.


Kedge   (2007-03-28 16:22:00) [11]

> [14] SLoW.AlfaMoon.Com   (28.03.07 16:16)
Leonid Troyanovsky же ясно написал: "если хоть один хендл процесса удерживается открытым"


SLoW.AlfaMoon.Com   (2007-03-28 16:16:00) [12]

Leonid Troyanovsky

Поясняю. Если в момент времени T существует приложение с PID = N, то существование в момент времени Т+1 приложения с PID = N не гарантирует, что это то же самое приложение, в силу специфики использования PIDов системой (При запуске приложению выдается один из свободных PIDов, если искомое приложение было прибито в период между измерениями, то есть вероятность, что ему достанется тот же самый PID).
Мне даже удавалось такую ситуацию воспроизводить, в принципе.


Сергей М.   (2007-03-28 14:12:00) [13]


> Я извеняюсь, а что такое мьютекс ?


Вот и задай этот вопрос в "Начинающие".


zero   (2007-03-28 13:16:00) [14]

Если программа, которую ты запускаешь, написана тобой, то есть вариант, например, такой - создаешь мьютекс в начале программы и закрываешь в конце.
--------------------------------
Я извеняюсь, а что такое мьютекс ?

То при запуске ты все равно получил хэндл этого процесса с полными правами.
-------------------------------------------
Вот только этот хендл получить, у меня не как не получаеться (


Leonid Troyanovsky   (2007-03-28 10:58:00) [15]


> SLoW.AlfaMoon.Com   (28.03.07 10:50) [10]

> Ты должен понимать, что: PID и тем более хэндл процесса
> однозначно оный не идентифицируют.

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

--
Regards, LVT.


SLoW.AlfaMoon.Com   (2007-03-28 10:50:00) [16]

Ты должен понимать, что: PID и тем более хэндл процесса однозначно оный не идентифицируют.

Если программа, которую ты запускаешь, написана тобой, то есть вариант, например, такой - создаешь мьютекс в начале программы и закрываешь в конце.

Если не тобой.. То при запуске ты все равно получил хэндл этого процесса с полными правами. Тогда выход такой - проверять время от времени путь к исполняемому файлу процесса. НО это тоже не панацея


zero   (2007-03-27 09:26:00) [17]

IceBeerg

pw:=GetParent(Application.Handle); - возвращает 0

По первому пункту вобще ничё не понял. Можно поподробней желательно с примерами, а то я с WinApi функциями только начал рабоать.


Leonid Troyanovsky   (2007-03-26 22:07:00) [18]


> 2. Как узнать из какой программы была запущена программа

> Надо чтоб работало и под Win98, WinNT, Win2000 и WinXP

NT4 из этого выпадает.

Хотя, лучше сказать, что выпал Win98.
Т.е.,  для остальных, например, NTQuerySystemInformation.

--
Regards, LVT.


Leonid Troyanovsky   (2007-03-26 21:58:00) [19]


> IceBeerg ©   (26.03.07 15:38) [3]

> If the function succeeds, the return value is the instance
> handle of the application that was run

Т.е., в лучшем случае, из полезного тебе вернут
the handle of a dynamic data exchange (DDE) server application.

Хотя, мне даже не очень понятно, как его полезно применить.
Уж лучше ShellExecuteEx with SEE_MASK_NOCLOSEPROCESS.

--
Regards, LVT.


Eraser   (2007-03-26 19:30:00) [20]

> [5] IceBeerg ©   (26.03.07 15:46)

MBo уже подсказал.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо