Я использую JNA 4.5+
Есть ли способ получить PID для приложения, запущенного с: new COMLateBindingObject("X.Application", _boolean_)
?
Что-то вроде:
COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
SomeUtil.INSTANCE.getPidFor(obj);
Я не могу использовать WMIC или метод на основе дескриптора окна, потому что у меня есть несколько одновременно работающих экземпляров одного и того же приложения.
Заранее спасибо.
К сожалению, найти эту информацию о COM-сервере напрямую невозможно. Как пишет Ханс Пассан кладет это:
Not exposing these implementation details, and making it impossible to find out, is by design. Like the clipboard.
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-сервера), и посмотрел, есть ли другое решение для проблемы, которую я решаю с помощью на самом деле. Возможно, вы могли бы уточнить, для чего вам на самом деле нужен идентификатор процесса?
Если целевое приложение (X.Application или myapp.Application) создано вами или что вы можете изменить, как насчет добавления интерфейса для получения идентификатора процесса?
В интерфейсе управления вводом-выводом розничного бизнеса, называемом OPOS, определены два уровня COM (ControlObject / ServiceObject), и ServiceObject может получить идентификатор процесса, которому принадлежит ControlObject.
Как показано ниже:
COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
int createdPID = obj.getProcessID();
Я понимаю, поэтому я решил пойти другим путем: я получу PID, используя дескриптор окна после открытия документа, вместо того, чтобы пытаться получить его раньше, на случай, если что-то пойдет не так. Лучше иметь и не нуждаться в нем, чем нуждаться и не иметь.