我正在使用JNA 4.5 +
是否可以获取以new COMLateBindingObject("X.Application", _boolean_)
开头的应用程序的PID?
类似的东西:
COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
SomeUtil.INSTANCE.getPidFor(obj);
我不能使用WMIC或基于窗口句柄的方法,因为我有多个同时运行的同一应用程序实例。
谢谢。
答案 0 :(得分:1)
很遗憾,无法直接找到有关COM服务器的信息。作为Hans Passant puts it:
不公开这些实现细节,并且使其无法查找是设计使然。就像剪贴板一样。
COM客户端应用程序不需要知道服务器对象是如何打包的,无论它们是作为进程内对象(在DLL中)还是作为本地或远程对象(在EXE中)打包。
COM的设计很简单,因此您无需了解这些详细信息。正如this question的作者在评论中所建议的那样,您可以在启动COM服务器之前和之后使用EnumProcesses
之类的东西检索进程列表,并检查创建了哪些进程,但是即使那样也可以。充其量是不准确的骇客。
我认为您可能遇到了XY problem。如果您是我,我将退后两步,考虑为什么我需要访问COM内部(有关已创建的COM服务器的过程的信息),然后查看问题是否实际上解决有不同的解决方案。也许您可以详细说明您实际需要使用哪个进程ID?
答案 1 :(得分:0)
如果目标应用程序(X.Application或myapp.Application)是由您创建的或可以修改的,那么添加接口以获取进程ID怎么办?
在称为OPOS的零售业务IO控制接口中,定义了两个COM(ControlObject / ServiceObject)级别,并且ServiceObject可以获取ControlObject所属的进程ID。
如下:
COMLateBindingObject obj = new COMLateBindingObject("myapp.Application", false);
int createdPID = obj.getProcessID();