VB连接到COM对象

时间:2012-12-10 21:58:16

标签: vb.net com

要么我不理解COM对象,要么令人困惑。 我经常'创建','调度'COM对象 - 在Python中,分别在VB(Obj = win32com.client.Dispatch('Visum.Visum')Obj = CreateObject("Excel.Application")中)。 这很容易,很明显,一切都很好。 但我怎么能: a)连接到已经运行的COM对象 b)获取作为COM对象的正在运行的进程列表

非常混乱(COM对象,服务器?连接,调度,注册?)

感谢您的工作 拉法尔 I2

2 个答案:

答案 0 :(得分:2)

首先,我建议您阅读COM的一个很好的介绍。就个人而言,我认为Don Box的“Essential COM”是关于COM的最佳书籍。花几个小时的时间可以在几个小时后为您节省时间。

话虽如此,让我们转到你的问题。

a)为了从VB检索现有的COM对象,您需要调用GetObject函数。这仅适用于使用Running Object Table注册的COM对象。 Excel这样做,所以不应该有任何问题。

b)正如Hans Passant正确指出的那样,这个问题没有意义。进程和COM对象是完全不相关的东西,除了进程托管COM对象这一事实。它类似于询问“哪些进程是类X的实例”。但是,进程可以托管COM对象(或其中许多对象)。这些物体只能暂时存活,所以你期望在那里?此外,许多COM类在dll中实现,但创建的实例显然是在一个进程中托管 - 所以你期望在那里做什么?

答案 1 :(得分:0)

COM技术是我一段时间没有使用过的东西,很抱歉,如果有些信息可能有问题(无论如何,我的书里面有“Inside COM +基础服务”!)

简单来说,让我们给出一个COM对象的简化定义:它只是一个标准的DLL,其中的类使用以下方法公开标准接口IUnkown:

  • AddRef:注册使用COM对象的客户端
  • 发布:取消注册客户端(通常未使用的对象停止运行,但其他对象可能仍然驻留)
  • QueryInterface:获取函数的地址

QueryInterface用于动态检索函数的地址(后期绑定),它功能强大(您不必在编译时知道DLL)但耗时。另一方面,您可以在编译时直接引用函数的地址,因为这些DLL已在系统中注册(所有信息都存储在注册表中)

创建新对象或获取正在运行的对象的地址是通过RPC(远程过程调用)完成的,它将加载和/或扮演代理角色

因此,要创建COM对象的新实例,您将在VC ++中调用CreateObject(在VB中)(Co)CreateInstance(甚至是c#?),而要获取正在执行的实例,您可能需要调用GetObject()

获取COM对象列表并不那么容易(我想根本不可能)因为,如前所述,COM对象只不过是一个DLL:这意味着该库将主要加载到地址空间中访问的每个进程都是私有的。即使对于在多个进程之间共享的对象的进程外COM对象(与进程相反)(即:Excel是进程外COM对象:您不在应用程序的地址空间中加载DLL),由主机(rpc.exe或专有主机)

加载

希望这会有所帮助 哔叽