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

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

Закрыть хендл, принадлежащий чужому просессу. [D5, Win2k]


Анатолий ©   (2004-07-16 17:49:00) 

Доброго времени суток. Возникла необходимось убивать хендл, принадлежащий чужому процессу. Что-то подобное делается в ProcessExplorer: есть процес и список хендлов принадлежащих ему, можна выбрать, скажем, file - \Device\Floppy0 и закрыть. Может кто подскажет, как это можно реализовать в своем коде. Известно, какой процес искать и известно как называется файл, хендл которого надо закрыть.

Заранее спасибо.


VMcL   (2004-07-19 18:08:00) [1]

>>Анатолий  (19.07.04 17:55) [11]

Посмотри на MSDN. Возможно есть способ дать команду службе спулера через SCM, чтобы он освободил порт, а потом снова "забрал" себе.

Вот это может поможет: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/graphics/hh/graphics/splarch_6aecc065-5eb8-4145-9081-c7418a466710.xml.asp


Анатолий   (2004-07-19 17:55:00) [2]

Спасибо, default навел на мысль. Сейчас пробую реализовать. Мне главное хендл аккуратно закрыть, а спулер потом когда ему надо, попытается его получить.

Но если известно как забрать этот хендл у Спулера не насильно, а как-нибудь попросить, ну, послать ему сообщение, "закрой порт, если ты сам не печатаешь в него", то подскажите, это конечно було бы предпочтительнее. (Просто в 2000 винде Спулер держит хендл порта постоянно, он перехватывает все обращения к нему и сам обрабатывает, а мне нужно обойтись без его "услуг" :) )


default   (2004-07-19 17:13:00) [3]

Суслик ©   (19.07.04 17:10) [9]
по сабжу вроде это и требуется...


Суслик   (2004-07-19 17:10:00) [4]


> закрыть хендл в чужом процессе можно через DuplicateHandle

а дальше что?


default   (2004-07-19 17:05:00) [5]

закрыть хендл в чужом процессе можно через DuplicateHandle
для этого надо получить хендл чего-то в контексте целевого процесса
посмотрите в MSDN возможно предоставляются интерфейсы для этого дела...


VMcL   (2004-07-19 16:55:00) [6]

... естественно, программно.


VMcL   (2004-07-19 16:54:00) [7]

>> Анатолий  (19.07.04 14:17) [4]

Твоя программа долго работает? Может лучше просто перед началом её работы останавливать службу, а по окончании запускать снова?


Cobalt   (2004-07-19 16:25:00) [8]

А что за задача такая?
Может, подойдёт такой вариант - запускается твоя прога, захватывает файл. Запускается Служба печати (кстати, как она реагирует на захват файла?)
Твоя прога выполняет необходимые действия, закрывает файл.


Анатолий   (2004-07-19 14:17:00) [9]

Мне и самому любопытно. Потому и спрашиваю. Факт следующий, ProcessExplorer может закрыть хендл принадлижащий тому или иному процессу.

Не знаю, что происходит с объектом ядра ФАЙЛ :), когда в ProcessExplorer выбрать CloseHandle на file - Device\Parallel0, который принадлежит поцессу Spoolsv. Или вернее что происходит с объектом ядра "драйвер устройства параллельного порта". Но факт в том, что после того как хендл на него (принадлежащий Spoolsv), закрыть из ProcessExplorer, я могу получить на него хендл из своего кода, а до этого не мог. (Не удивительно, Device\Parallel0 (LPT1) можно открыть только с ексклюзивным доступом, кто первый открыл, тому и будет).

Итак, как мне сделать из своего кода то-же, что юзер делает из ProcessExplorer? :)


Digitman   (2004-07-19 13:23:00) [10]


> Нужно как нибудь отобрать у спулера этот файл. Вот как ProcessExplorer,
> например


любопытно, каким образом ProcessExplorer "отбирает" какой-то там файл у кого-то


Анатолий   (2004-07-19 12:05:00) [11]

Прога - это Спулер печати. Spoolsv, служба. Она держит хендл \Device\Parallel0, другими словами открытый LPT1 порт. Мне надо открыть его самому, и, понятно, не могу. Такая ситуация, что службу остановить нельзя (ну, в принципе можно, но не желательно по условию задачи). Нужно как нибудь отобрать у спулера этот файл. Вот как ProcessExplorer, например, только из моего кода. Или вы знаете более цивилизованый метод? :)


Cobalt   (2004-07-17 09:23:00) [12]

А что за прога?


Наверх

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