【问题标题】:Is it possible to prohibit putting my in-proc component into COM+?是否可以禁止将我的进程内组件放入 COM+?
【发布时间】:2010-11-30 23:53:44
【问题描述】:

我有一个 ATL C++ 进程内 COM 组件。此组件不供外部使用 - 我只需要在我们的应用程序中使用它。

有时用户将其放入 COM+ 中,这会导致各种奇怪的错误——“访问被拒绝”等我不想听到的。最好的方法是禁止将组件放入 COM+ 中,这样它就只能用作进程内服务器。有没有办法做到这一点?

【问题讨论】:

    标签: windows com interop com-interop atl


    【解决方案1】:

    您是否只实现自己的接口?如果是这样,您应该可以在 IDL 中将它们标记为“[local]”,然后将模块中的所有编组信息(类型库、P/S)等剥离。

    如果没有可用的编组基础,COM+ 应该无法注册该模块。 COM+ 的拦截机制依赖于强制对象进入远程上下文并进入代理和存根及其对应方之间。因此,如果您删除所有编组的机会,它应该无法拦截您的接口方法。

    【讨论】:

    • 我检查了您建议的所有内容,但 COM+ 仍然乐于添加该组件。我想这将无法使用 - CoCreateInstance() 将失败并出现不同的抱怨,例如“不支持接口” - 但实际上这与我开始时遇到的问题相同。因此,我没有解决问题,而是缩小了它可能来自的表面。通常用户会添加我们的组件,因为它的 ProgID 在已注册组件的列表中,并且与我们其他组件的 ProgID 相似。所以他们只是“添加一切”。我更改了注册表公开代码,使其仅公开 ClassId...
    • ...希望这个问题不会再困扰我们。非常感谢您的建议 - 现在我们知道这些步骤并不能真正解决问题。
    【解决方案2】:

    阻止注册您的模块已完成,然后按照本文Creating COM objects directly from the dll 中所述使用您的DLL。

    【讨论】:

    • 好主意。特别是因为我总是重新分发 COM 组件,并且它总是与其使用者在同一个文件夹中。
    猜你喜欢
    • 2021-08-03
    • 2020-10-20
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多