从当前的COMLateBindingObject获取ProcessID

时间:2018-10-23 19:22:49

标签: java com jna

我正在使用JNA 4.5 +

是否可以获取以new COMLateBindingObject("X.Application", _boolean_)开头的应用程序的PID?

类似的东西:

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

我不能使用WMIC或基于窗口句柄的方法,因为我有多个同时运行的同一应用程序实例。

谢谢。

2 个答案:

答案 0 :(得分:1)

很遗憾,无法直接找到有关COM服务器的信息。作为Hans Passant puts it

  

不公开这些实现细节,并且使其无法查找是设计使然。就像剪贴板一样。

来自COM Clients and Servers

  

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();