2009-07-14 77 views
1

我有一个COM inproc DLL,我们正在使用我们的产品。 现在,如果有人发现我们已经从DLL中公开了哪些接口和API,那么可以轻松调用这些API。如何阻止某人调用我的COM接口API?

有没有办法阻止未知的应用程序调用我的API?

我们可以在COM中添加一些签名吗?

+0

要获得更多相关答案,您应该指定COM服务器和可能的客户端使用的语言/技术。 – sharptooth 2009-07-15 06:08:18

+0

我使用C++为客户端和服务器 – anand 2009-07-15 11:22:06

回答

3

控制对象使用的正式方法是在创建COM对象的类工厂上实现IClassFactory2。

下面是MSDN上的一个链接,解释接口。

IClassFactory2 at MSDN

创建实现的好处是,没有人可以不通过IClassFactory2清理登记的障碍获取一个实例。

缺点是您必须检查所有创建对象的位置,以确保它们没有损坏。创建实例变得更加繁琐,尽管一些语言已经有了一些设备来减少这个过程(例如VB6)。

如果您试图保护一个具有大量实例化活动的对象,那么您可能需要使用Mastermind添加关键参数的方法,或者添加某种类型的解锁方法到您必须正确调用的接口在它之后的组件可以被使用之前。

1

没有什么能够阻止你在方法中添加一个“key”参数,如果关键是错误的,这个方法会返回。

非常简单,但会为初学者做。

0

除了某种'关键'参数之外,你不能阻止好奇发现你的函数然后调用它。它只需要一个调试器和一些耐心。为了完全安全起见,您必须要求授权代码可以获得的某种证书,但其他所有人都不能这样做,但这意味着您的代码必须能够验证证书。

2

你可以使你的接口直接从IUnknown继承(没有IDispatch)并且不包含类型库到DLL中。通过这种方式,只有那些有权访问类型库的人才能够找到支持哪些接口,并且唯一的另一种发现接口的方法将只是猜测。如果你这样做,你可能也希望尽量减少暴露给注册表的类的数量(可以使用CoCreateInstance()创建的类),并使用一些专门的注册表公开类的工厂方法集。

这意味着只有vtable早期绑定可以与你的组件一起工作。您也将无法使用此组件的默认呼叫编组(因为没有包含类型库)。这不是真正的保护,只是隐藏事物的一种方式。