从当前 COMLate 绑定对象获取进程 ID

Get ProcessID from current COMLateBindingObject

我正在使用 JNA 4.5+

有没有办法获取启动于以下内容的应用程序的 PID:new COMLateBindingObject("X.Application", _boolean_)

类似于:

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

我不能使用 WMIC 或 window 基于句柄的方法,因为我有多个并发的 运行 同一个应用实例。

提前致谢。

很遗憾,无法直接查找有关 COM 服务器的信息。正如汉斯·帕桑 puts it:

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

来自COM Clients and Servers

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 的设计很简单,因此您 不需要知道 这些细节。正如 this question 的作者在评论中所建议的那样,您可以在启动 COM 服务器之前和之后使用类似 EnumProcesses 的内容来检索进程列表并检查创建了哪些进程,但即便如此充其量是一个不准确的骇客。

我想你可能 运行 变成了 XY problem。如果我是你,我会退后两步,思考为什么我需要访问 COM 的内部结构(有关创建的 COM 服务器的进程的信息),看看我的问题是否实际上 solving 有不同的解法。也许您可以详细说明您实际需要进程 ID 的目的是什么?

如果目标应用程序(X.Application或myapp.Application)是您自己创建的或者您可以修改的,添加一个获取进程ID的接口如何?

在名为OPOS的零售业务IO控制接口中,定义了两层COM(ControlObject/ServiceObject),ServiceObject可以获取ControlObject所属的进程ID。

如下:

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