1

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

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

有没有什么可以帮助我在不需要客户 ID 参数的情况下实现这种情况?

4

2 回答 2

1

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

...客户端用于在指定代理上进行调用的身份验证信息

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

于 2015-06-10T05:37:54.340 回答
0

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

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

深入研究其他 COM API 函数可能会发现一些其他可能性。如果可以确定通过IContext接口提供的属性,则CoGetObjectContext看起来可能很有用。文档对这些内容不太公开。

于 2015-06-10T09:27:59.217 回答