获取指向现有 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 对象的指针?的主要内容,如果未能解决你的问题,请参考以下文章

获取双指针指向的对象

在类中获取指向自身的指针

给定一个指向对象的超类指针,如何获取对象的大小?

c ++如何获取指向另一个类中的当前对象的指针?

在 QPlainTextEdit 中获取指向 QTextBlock 的指针

C++获取基类指针所指子类对象的类名