VB6 help on GetObject说“您不能使用GetObject来获取对使用Visual Basic创建的类的引用”(最后一句话!)。我的VB6 GUI将对象公开为ActiveX exe,以便其他组件进行操作。我希望其他组件连接到已经在运行的GUI,而不是启动该exe的新实例。如果使用以下语法,我发现使用GetObject确实有效:

Set myobj = GetObject("", "ProjectName.ClassName")

令我担心的是,帮助人员说这应该行不通,尽管我已经做了很多测试,并且到目前为止还没有发现任何问题。那里有COM专家可以告诉我是否会遇到问题吗?而且我仍然可以使用CreateObject吗?

ActiveX exe设置是:仅具有一个线程的线程池。该类具有MultiUse实例化。无论如何,这些设置足以阻止CreateObject启动exe的新实例。那是对的吗?

最佳答案

该文档令人困惑,但正确。您引用的MSDN页面有助于解释为什么GetObject调用不引发错误:



这很微妙,但含义是

GetObject "", "ProjectName.ClassName

实际上等于
CreateObject "ProjectName.ClassName"

也就是说,将空字符串传递给GetObject的第一个参数使其操作完全类似于CreateObject,这意味着它将创建该类的新实例,而不是返回对已经运行的实例的引用。

回到MSDN摘录,它提到完全省略GetObject的第一个参数将导致GetObject返回对已经运行的实例(如果存在)的引用。这样的调用看起来像这样:
GetObject , "ProjectName.ClassName" 'Note nothing at all is passed for the first argument'

但是,如果尝试执行此操作,则将立即收到运行时错误。当文档说GetObject不适用于使用VB6创建的类时,这就是该文档所指的用例。

之所以不起作用,是因为GetObject如何发挥其魔力。当省略第一个参数时,它将尝试通过查询运行对象表(ROT)来返回现有的对象实例,ROT是包含运行COM对象的计算机范围的查找表。问题是对象必须由创建它们的进程显式地注册到运行对象表中,以便其他进程可以访问-VB6运行时不在ROT中注册ActiveX EXE类,因此GetObject无法检索对已经运行的实例的引用。

关于com - GetObject和VB6 ActiveX exe,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/914628/

10-09 20:50