获取指向现有 COM 对象的指针?
Posted
技术标签:
【中文标题】获取指向现有 COM 对象的指针?【英文标题】:Getting a pointer to an existing COM object? 【发布时间】:2013-02-13 17:24:08 【问题描述】:如何获得指向在同一台机器上以不同进程创建的现有 COM 对象的指针?
我有一个Credential Provider,它创建了一个继承ICredentialProvider 的对象。 ICredentialProvider 有一个方法SetSerialization。
我还有一个服务,我需要从中调用 Credential Provider 的 SetSerialization 方法。问题是,我在 C++ 方面经验丰富,但我是 COM 的初学者,所以我不知道如何。 Microsoft 的sample 'CSampleProvider's cmets 说要从“远程客户端”调用 SetSerialization 方法,但没有解释如何 - 我假设他们假设您知道 COM。
我整天都在阅读关于 COM 的 MSDN 和各种 tutorials,并且我已经到了可以在服务中使用我的凭据提供程序的 create an instance 的地步,但我需要得到一个指针到已经存在的 Credential Provider 对象,而不是创建一个新的,我不知道如何。
它是怎么做的?
谢谢。
【问题讨论】:
你不能到处乱跑,从随机进程中窃取指针。您必须安排将凭证提供者交给该服务。但是,让我们退后一步。为什么要调用 ICredentialProvider::SetSerialization?就像示例中所说的那样,该方法适用于远程桌面客户端,因此它可以在您连接时预先填充“登录为...”对话框。目前尚不清楚您的服务为什么需要这样做。 @RaymondChen:'你必须安排将凭证提供者交给服务' - 是的,这就是我需要的,但不知道如何在 COM 世界中做到这一点。场景是:我们有 'x' 台机器由“指导员”机器控制,通过命名管道与远程机器上运行的服务通信。讲师需要能够通过在讲师机器上按一个按钮来锁定/解锁所有远程机器。我的印象是,当教练要求时,我可以从服务中调用 SetSerialization 来自动登录到远程机器。 所以也许看起来我好像一直在追逐,我将不得不做一些事情,比如通过某种形式的 IPC 将凭据从服务传递给凭据提供程序,可能是另一种管道? 您需要在凭证提供者和服务之间设置一些IPC。但是退后一步:即使你得到了指针并想调用 SetSerialization,你会传递什么? (注:我也不知道。) @RaymondChen:我想我会通过管道将用户名和密码发送给凭证提供者,然后让凭证提供者处理序列化。如果您想在答案中总结您的 cmets,我很乐意接受。感谢您的宝贵时间。 【参考方案1】:规范方法是通过Running Object Table
。假设对象有一个“名字对象”,即一个 COM 名称,并且这个名字对象已注册。
请注意,ROT 是 IPC 的一种形式,特别是 COM 对象的系统范围目录。
【讨论】:
完美。看起来正是我需要的。我已经实现了 pipe 方法,现在它可以很好地满足我的需要。在这种情况下,我可能不会使用 ROT 方法,但它仍然是我一直在寻找的,并且非常适合将来参考。谢谢。【参考方案2】:正如雷蒙德所说,简而言之,你不能——至少不能通过任何内置的 COM 功能。如果必须,则需要通过某种形式的Inter Process Communication 传递。
【讨论】:
以上是关于获取指向现有 COM 对象的指针?的主要内容,如果未能解决你的问题,请参考以下文章