Форум: "WinAPI";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизЗакрыть хендл, принадлежащий чужому просессу. Найти похожие ветки
← →
Анатолий (2004-07-16 17:49) [0]Доброго времени суток. Возникла необходимось убивать хендл, принадлежащий чужому процессу. Что-то подобное делается в ProcessExplorer: есть процес и список хендлов принадлежащих ему, можна выбрать, скажем, file - \Device\Floppy0 и закрыть. Может кто подскажет, как это можно реализовать в своем коде. Известно, какой процес искать и известно как называется файл, хендл которого надо закрыть.
Заранее спасибо.
← →
Cobalt © (2004-07-17 09:23) [1]А что за прога?
← →
Анатолий (2004-07-19 12:05) [2]Прога - это Спулер печати. Spoolsv, служба. Она держит хендл \Device\Parallel0, другими словами открытый LPT1 порт. Мне надо открыть его самому, и, понятно, не могу. Такая ситуация, что службу остановить нельзя (ну, в принципе можно, но не желательно по условию задачи). Нужно как нибудь отобрать у спулера этот файл. Вот как ProcessExplorer, например, только из моего кода. Или вы знаете более цивилизованый метод? :)
← →
Digitman © (2004-07-19 13:23) [3]
> Нужно как нибудь отобрать у спулера этот файл. Вот как ProcessExplorer,
> например
любопытно, каким образом ProcessExplorer "отбирает" какой-то там файл у кого-то
← →
Анатолий (2004-07-19 14:17) [4]Мне и самому любопытно. Потому и спрашиваю. Факт следующий, ProcessExplorer может закрыть хендл принадлижащий тому или иному процессу.
Не знаю, что происходит с объектом ядра ФАЙЛ :), когда в ProcessExplorer выбрать CloseHandle на file - Device\Parallel0, который принадлежит поцессу Spoolsv. Или вернее что происходит с объектом ядра "драйвер устройства параллельного порта". Но факт в том, что после того как хендл на него (принадлежащий Spoolsv), закрыть из ProcessExplorer, я могу получить на него хендл из своего кода, а до этого не мог. (Не удивительно, Device\Parallel0 (LPT1) можно открыть только с ексклюзивным доступом, кто первый открыл, тому и будет).
Итак, как мне сделать из своего кода то-же, что юзер делает из ProcessExplorer? :)
← →
Cobalt © (2004-07-19 16:25) [5]А что за задача такая?
Может, подойдёт такой вариант - запускается твоя прога, захватывает файл. Запускается Служба печати (кстати, как она реагирует на захват файла?)
Твоя прога выполняет необходимые действия, закрывает файл.
← →
VMcL © (2004-07-19 16:54) [6]>>Анатолий (19.07.04 14:17) [4]
Твоя программа долго работает? Может лучше просто перед началом её работы останавливать службу, а по окончании запускать снова?
← →
VMcL © (2004-07-19 16:55) [7]... естественно, программно.
← →
default © (2004-07-19 17:05) [8]закрыть хендл в чужом процессе можно через DuplicateHandle
для этого надо получить хендл чего-то в контексте целевого процесса
посмотрите в MSDN возможно предоставляются интерфейсы для этого дела...
← →
Суслик © (2004-07-19 17:10) [9]
> закрыть хендл в чужом процессе можно через DuplicateHandle
а дальше что?
← →
default © (2004-07-19 17:13) [10]Суслик © (19.07.04 17:10) [9]
по сабжу вроде это и требуется...
← →
Анатолий (2004-07-19 17:55) [11]Спасибо, default навел на мысль. Сейчас пробую реализовать. Мне главное хендл аккуратно закрыть, а спулер потом когда ему надо, попытается его получить.
Но если известно как забрать этот хендл у Спулера не насильно, а как-нибудь попросить, ну, послать ему сообщение, "закрой порт, если ты сам не печатаешь в него", то подскажите, это конечно було бы предпочтительнее. (Просто в 2000 винде Спулер держит хендл порта постоянно, он перехватывает все обращения к нему и сам обрабатывает, а мне нужно обойтись без его "услуг" :) )
← →
VMcL © (2004-07-19 18:08) [12]>>Анатолий (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-c7 418a466710.xml.asp
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c