![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрыть хендл, принадлежащий чужому просессу. [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]А что за прога?