Форум: "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.048 c