Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

Обмен данными между процессами   Найти похожие ветки 

 
zero   (2007-03-26 14:36) [0]

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

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

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


 
IceBeerg ©   (2007-03-26 15:28) [1]

1. Мониторить HWND (когда запускаеш - получай HWND запуценного процесса)
2. Смотреть родительский ID (может быть не верным или приложения с такми ID может не быть)


 
MBo ©   (2007-03-26 15:34) [2]

CreateProcess+WaitForSingleObject


 
IceBeerg ©   (2007-03-26 15:38) [3]

1. The ShellExecute function opens or prints a specified file. The file can be an executable file or a document file. See ShellExecuteEx also.

HINSTANCE ShellExecute(
   HWND hwnd,
...

Return Values

If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.

2. The GetParent function retrieves the handle of the specified child window"s parent window.

HWND GetParent(
   HWND hWnd  // handle of child window
  );


Parameters

hWnd

Identifies the window whose parent window handle is to be retrieved.


 
GrayFace ©   (2007-03-26 15:42) [4]

IceBeerg ©   (26.03.07 15:28) [1]
1. Мониторить HWND (когда запускаеш - получай HWND запуценного процесса)

Плохой способ.


 
IceBeerg ©   (2007-03-26 15:46) [5]


2 GrayFace ©   (26.03.07 15:42) [4]
> Плохой способ.

Согласен, но подскажи лучше.


 
Eraser ©   (2007-03-26 19:30) [6]

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

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


 
Leonid Troyanovsky ©   (2007-03-26 21:58) [7]


> 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.


 
Leonid Troyanovsky ©   (2007-03-26 22:07) [8]


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

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

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

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

--
Regards, LVT.


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

IceBeerg

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

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


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

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

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

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


 
Leonid Troyanovsky ©   (2007-03-28 10:58) [11]


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

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

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

--
Regards, LVT.


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

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

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


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


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


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


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

Leonid Troyanovsky

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


 
Kedge ©   (2007-03-28 16:22) [15]

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


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

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


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


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

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

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

--
Regards, LVT.


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

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


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


 
GrayFace ©   (2007-03-29 18:11) [19]

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

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


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

GrayFace ©   (29.03.07 18:11) [19]

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


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


 
Ketmar ©   (2007-03-30 12:26) [21]

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


 
GrayFace ©   (2007-04-02 13:42) [22]

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

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


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

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


 
Riply ©   (2007-04-04 11:30) [24]

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.037 c
2-1189414509
andreoman
2007-09-10 12:55
2007.10.07
отобразить модальное окно поверх немодального


15-1188978747
Nic
2007-09-05 11:52
2007.10.07
Настройка web - сервака: ещё пара вопросов


2-1189499934
vasyl
2007-09-11 12:38
2007.10.07
Автозапуск


4-1175969967
AGGRESSOR
2007-04-07 22:19
2007.10.07
GUI (redirect output from console application)


15-1189494932
TUser
2007-09-11 11:15
2007.10.07
Ищу дрова





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский