要么我不理解COM对象,要么令人困惑。
我经常'创建','调度'COM对象 - 在Python中,分别在VB(Obj = win32com.client.Dispatch('Visum.Visum')
或Obj = CreateObject("Excel.Application")
中)。
这很容易,很明显,一切都很好。
但我怎么能:
a)连接到已经运行的COM对象
b)获取作为COM对象的正在运行的进程列表
CreateObject
命令的其他信息。在Python中,它是定义良好,全面的win32com
库的一部分,而在VB中它只是单一方法而没有引用:http://msdn.microsoft.com/en-us/library/7t9k08y5(v=vs.80).aspx 非常混乱(COM对象,服务器?连接,调度,注册?)
感谢您的工作 拉法尔 I2
答案 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:
QueryInterface用于动态检索函数的地址(后期绑定),它功能强大(您不必在编译时知道DLL)但耗时。另一方面,您可以在编译时直接引用函数的地址,因为这些DLL已在系统中注册(所有信息都存储在注册表中)
创建新对象或获取正在运行的对象的地址是通过RPC(远程过程调用)完成的,它将加载和/或扮演代理角色
因此,要创建COM对象的新实例,您将在VC ++中调用CreateObject(在VB中)(Co)CreateInstance(甚至是c#?),而要获取正在执行的实例,您可能需要调用GetObject()
获取COM对象列表并不那么容易(我想根本不可能)因为,如前所述,COM对象只不过是一个DLL:这意味着该库将主要加载到地址空间中访问的每个进程都是私有的。即使对于在多个进程之间共享的对象的进程外COM对象(与进程相反)(即:Excel是进程外COM对象:您不在应用程序的地址空间中加载DLL),由主机(rpc.exe或专有主机)
加载希望这会有所帮助 哔叽