Может ли внепроцессный COM-объект определить его родительский процесс? - PullRequest
5 голосов
/ 02 июня 2010

Из COM-объекта вне процесса (LocalServer32) можно определить клиентский процесс, который запросил создание объекта? - если быть точным, мне нужно заполучить командную строку клиентских процессов.

Этот вопрос возникает потому, что (из-за плохой стандартизации, реализации и поддержки) потенциальные сторонние клиенты объекта имеют различные особенности, которые необходимо обойти объекту.

Для этого объект должен иметь возможность идентифицировать своего текущего клиента.

Расширить интерфейс COM-объекта, чтобы клиент мог идентифицировать себя, к сожалению, невозможно ... или, если быть более точным, интерфейс можно расширить, но я не смогу заставить клиентов вызывать расширение.

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

Изучив это дальше, я подозреваю, что ответ будет "НЕТ", но непременно скажите мне, что я неправ.

Используя Process Explorer, я вижу, что родительский процесс для моего COM-объекта является экземпляром "svchost.exe", а не клиентским приложением.

1 голос
/ 19 июня 2011

Поскольку процессы COM-сервера совместно используются всеми клиентами с одинаковым AppID, фактически невозможно получить PID клиентского приложения. Как сказал @Anders, вы можете использовать CoImpersonateClient (или, лучше, позвонить CoGetCallContext и опросить получившийся IServerSecurity ), чтобы найти учетную запись и войти сеанс вызывающей стороны, но вы не можете получить сам процесс.

Если вы пытаетесь обойти ошибки в устаревших клиентах, я бы порекомендовал вам создать новый набор CLSID (или IID, если вы можете эмулировать все ошибки, на которые опираются устаревшие клиенты с помощью прокладок), для новых (не устаревших) ) клиенты с ОЧЕНЬ строгой проверкой ввода и реализуют новые функции только в этих новых CLSID. Устаревшие клиенты придерживаются своего старого CLSID, в котором вы можете просто использовать существующую унаследованную реализацию (или клон, совместимый с ошибками).

0 голосов
/ 02 июня 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...