通过 IDispatch 公开 COM 函数的服务器如何区分调用函数而不传递任何 ID 参数的不同客户端?

How does a server that expose COM functions via IDispatch can distinct between different clients that Invoke functions without passing any ID param?

我有一个 Windows 服务,它公开了一些要通过 IDispatch Invoke 调用的 COM 函数。有不同的客户端(Windows 应用程序)可以随时调用这些功能中的任何一个。我需要在 Windows 服务中引入一个不需要对客户端进行任何更改的更改(我无法修改它们)。我需要区分(如 ID)哪个应用程序正在调用函数。注意:我不需要知道确切的客户端应用程序,只需区分当前会话中的不同客户端就足够了。

例如:假设有两个客户端 C1 和 C2。当 C1 在 Windows 服务 (WS) 中调用函数 F1 时,WS 知道每次(在当前会话期间)客户端 X1(注意我说 X1,因为 WS 不需要确切地知道 C1 调用了 F1 , 只是为了给 C1 分配一个 ID 就像 PID~process ID~)。所以,现在 C3 调用 F2,WS 知道客户端 X2(不同于 X1)调用了 F2。然后,C1 调用 FX(WS 公开的任何 COM 函数)WS 可以区分 X1 调用 FX,而不是客户端 Xn(如 X2)调用 FX。

有什么可以帮助我实现这种情况而不需要客户提供 ID 参数吗?

没有关于来电者的信息,除了可能

...authentication information the client uses to make calls on the specified proxy

如果您对区分调用者感兴趣,典型的解决方案是添加一个方法参数,或者为每个调用者创建一个单独的对象,以便他们在其特定实例上调用方法。

我的第一个想法是简单地比较服务器中的客户端 IUnknown 地址。如果两个调用具有相同的 IUnknown,则它们使用相同的代理并且应该来自相同的客户端。

您还可以使用 CoGetCallerTID 获取某种客户端标识符。此 COM API 函数 returns 调用者公寓的 ID。通常这是调用者进程中线程 运行 的线程 ID。这可能无法保证在所有调用者中都是唯一的,因为您还需要进程 ID 来确保这一点。

深入研究其他 COM API 函数可能会发现一些其他的可能性。 CoGetObjectContext looks like it might be useful if the properties made available via the IContext接口可以确定。关于这些的文档不太方便。