Получить ProcessID из текущего COMLateBindingObject

Я использую JNA 4.5+

Есть ли способ получить PID для приложения, запущенного с: new COMLateBindingObject("X.Application", _boolean_)?

Что-то вроде:

COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
SomeUtil.INSTANCE.getPidFor(obj);

Я не могу использовать WMIC или метод на основе дескриптора окна, потому что у меня есть несколько одновременно работающих экземпляров одного и того же приложения.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

К сожалению, найти эту информацию о COM-сервере напрямую невозможно. Как пишет Ханс Пассан кладет это:

Not exposing these implementation details, and making it impossible to find out, is by design. Like the clipboard.

От COM-клиенты и серверы:

COM client applications do not need to be aware of how server objects are packaged, whether they are packaged as in-process objects (in DLLs) or as local or remote objects (in EXEs).

COM просто спроектирован так, что вы должны не нужно знать эти детали. Как было предложено в комментариях автора этот вопрос, вы можете прибегнуть к получению списка процессов с помощью чего-то вроде EnumProcesses до и после запуска COM-сервера и проверки того, какие процессы были созданы, но даже это в лучшем случае будет неточным взломом.

Я думаю, вы могли столкнуться с XY проблема. На вашем месте я бы сделал два шага назад и подумал, почему мне нужен доступ к внутренним компонентам COM (информация о процессе создания COM-сервера), и посмотрел, есть ли другое решение для проблемы, которую я решаю с помощью на самом деле. Возможно, вы могли бы уточнить, для чего вам на самом деле нужен идентификатор процесса?

Я понимаю, поэтому я решил пойти другим путем: я получу PID, используя дескриптор окна после открытия документа, вместо того, чтобы пытаться получить его раньше, на случай, если что-то пойдет не так. Лучше иметь и не нуждаться в нем, чем нуждаться и не иметь.

Gabriel 25.10.2018 14:30

Если целевое приложение (X.Application или myapp.Application) создано вами или что вы можете изменить, как насчет добавления интерфейса для получения идентификатора процесса?

В интерфейсе управления вводом-выводом розничного бизнеса, называемом OPOS, определены два уровня COM (ControlObject / ServiceObject), и ServiceObject может получить идентификатор процесса, которому принадлежит ControlObject.

Как показано ниже:

COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
int createdPID = obj.getProcessID();

Другие вопросы по теме