Любой способ получить объект из ROT, когда зарегистрированное имя не является уникальным? - PullRequest
2 голосов
/ 21 мая 2011

Мне нужно получить конкретный экземпляр работающего объекта (из c #).Возможно, что запущено несколько экземпляров этого приложения.К сожалению, это приложение всегда регистрируется в ROT с одинаковым именем (например, "! {DED89DB0-45B6-11CE-B307-0800363A1E02}").Я могу перебрать ROT, используя методы, показанные здесь , и найти уникальный экземпляр моего приложения, но когда я использую метод GetObject для экземпляра IRunningObjectTable, он всегда возвращает первый зарегистрированный объект.

Есть ли способ получить ссылку на этот конкретный объект?Так близко, но пока так далеко ...

1 Ответ

2 голосов
/ 05 сентября 2011

Это довольно сложная вещь, и для этого нет реального решения. В одном из наших проектов мы решили это следующим образом:

- вам нужно создать и приложение на C ++ (.NET слишком высокого уровня), которое переопределяет RegisterActiveObject и RevokeActiveObject с помощью вашего собственного метода, установите хук.
- вам нужно запустить приложение ДО запуска приложения.
- при запуске кода он будет прослушивать события для создания новых объектов в ROT
- ваш код должен перехватить это (переопределяя RegisterActiveObject)
- проверьте, является ли интересующий вас объект регистрации
- если это так, вы можете изменить его имя (например, добавив PID в конце) и добавить к ROT
- теперь у вас есть, например, следующий элемент

! {DED89DB0-45B6-11CE-B307-0800363A1E02}
! {DED89DB0-45B6-11CE-B307-0800363A1E02}
! {DED89DB0-45B6-11CE-B307-0800363A1E02} _3365
! {DED89DB0-45B6-11CE-B307-0800363A1E02} _4564

  • теперь последние 2 записи указывают на разные экземпляры вашего приложения, вы можете получить его тогда из ROT по имени. Конечно, добавление PID - это просто пример, вы можете изменить имя по своему желанию (если оно остается уникальным - в этом весь смысл).


    Посмотрите в psapi.h и dbghelp.h.


    Удачи,
    Блез
...