【问题标题】:How to tell if a library is COM or DCOM?如何判断库是 COM 还是 DCOM?
【发布时间】:2015-06-19 14:37:58
【问题描述】:

我的任务是尝试重新创建一个对原始 DLL 进行轻微修改的 DLL,如果另一个程序运行,它将被执行。基本上是 DLL 的模拟版本,用于测试/模拟更大系统的其他部分。

我正在寻找是否有任何方法可以检查库是 COM 还是 DCOM,但没有找到。我是aware of thedifferences,但是给定一个DLL库,我怎么知道它是COM库还是DCOM库

另外,有没有办法用更新的技术替换 COM/DCOM 库,但不更改调用 COM/DCOM 库的部分代码?

【问题讨论】:

  • 几乎每个COM服务器都可以在不改变可执行文件的情况下进行DCOM,只需要额外的配置。关注它现在是如何被使用的。
  • 感谢您的建议。调查一下!

标签: dll com dcom


【解决方案1】:

只有可执行代码,你无法分辨它是什么,除非它附带代理/存根 dll,你可以假设它是 DCOM。

明显的区别在于事物的注册方式。根据注册的实施方式,深入了解注册过程可能很容易或不太容易。如果注册参数是手工粘贴在代码中的,则必须以更难的方式对其进行逆向工程。如果注册使用存储在资源中的 .rgs 文件,您可以提取它并查看注册是如何完成的。无论如何,最好的办法是使用 VM 并导出其注册表,然后注册组件,再次导出注册表并查看差异 - 添加了什么。

【讨论】:

  • 我注意到 COM 如何使用 cocreateInstance 函数,而 DCOM 是 cocreateInstanceEx,其他调用可执行代码的代码使用它。这是确定库是 COM 还是 DCOM 的一种可能方法吗?
  • @matrixanomaly CoCreateInstanceEx() 允许在另一台计算机上实例化 DCOM 服务器,但是您也可以使用 CoCreateInstance() 在同一台计算机上实例化它。
【解决方案2】:

哇,你在这里上学了!

如果我没记错的话,任何有效的 COM 对象也可以参与 DCOM。远程过程调用的接线不是在操作系统级别完成的吗?

来自https://msdn.microsoft.com/en-us/library/aa295360(v=vs.60).aspx

一旦 COM 适应了跨网络工作,那么任何接口都可以 未绑定到本地执行模型(某些接口具有固有的 依赖本地机器设备,例如那些绘图界面 其方法将设备上下文句柄作为参数)将 具有分布式的能力:接口消费者将 对给定接口发出请求;可以提供该接口 通过在不同的对象上运行(或将要运行)的对象的实例 机器。 COM 内部的分配机制将连接 消费者以这样的方式向提供者提供方法调用 消费者将出现在提供者端,他们将在哪里 执行。然后将任何返回值发送回消费者。 就所有意图和目的而言,分发行为对 消费者和提供者。

现在确实存在这样多种 COM。 DCOM(代表“分布式 COM”)是 从 4.0 版开始随 Windows NT 版本一起提供。自从 1996 年末,它也可用于 Windows 95 及其 衍生品。在这两种情况下,DCOM 都包含一组替换和 附加的 DLL,带有一些实用程序,它们提供本地和 远程 COM 功能。因此,它现在是 基于 Win32 的平台,并将在其他平台上提供 随着时间的推移由其他组织提供。

【讨论】:

  • 是的,我知道是对的,我目前的实习是让我尝试用返回 true/false 的模拟函数替换一个库来测试系统的大部分。无济于事我不容易获得所述图书馆的来源。当我提到它时,每个做过 COM/DCOM 的人(不是很多)都会抱怨并为我感到难过。谢谢。
  • COM 在今天的 Windows 中仍然无处不在。 DCOM 并不总是意味着“交易”。这只是他们在添加通过网络进行 COM 的能力时提出的一个花哨的名字。同时,出于这个原因,他们消除了进程间通信对 Windows 消息的硬依赖,尽管它仍然可以使用/可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2016-09-16
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多