通过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服务,它暴露了一些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看起来可能很有用。文档中没有详细说明。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++模板函数,用于比较任何无符号整数和有符号整数
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 不执行任何操作的函数调用C++
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- 接受任何 STL 容器的函数
- C++:单向跳转到函数.任何替代方案
- 从析构函数调用虚拟函数-任何解决方法