通过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?

本文关键字:函数 任何 ID 参数 客户端 调用 COM 公开 IDispatch 服务器 通过      更新时间:2023-10-16

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

例如:假设有两个客户机C1和C2。当C1调用Windows Service (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参数?

没有关于调用者的信息,除了可能

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

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

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

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

深入研究其他COM API函数可能会发现一些其他的可能性。如果可以确定通过IContext接口提供的属性,那么CoGetObjectContext看起来可能很有用。文档中没有详细说明。

相关文章: