该文档令人困惑,但正确。您引用的MSDN页有助于解释为什么你GetObject
电话不会引发错误:
If pathname [the first argument] is a zero-length string (""), GetObject returns a new object instance of the specified type. If the pathname argument is omitted, GetObject returns a currently active object of the specified type. If no object of the specified type exists, an error occurs.
这是微妙的,但含义是
GetObject "", "ProjectName.ClassName
实际上相当于
CreateObject "ProjectName.ClassName"
也就是说,将一个空字符串传递给第一个参数GetObject
使其操作与CreateObject
完全相同,这意味着它将创建一个新实例的类,而不是返回一个已经运行的实例的引用。
回到MSDN摘录,它提到将GetObject
的第一个参数全部省略将导致GetObject
返回对已存在的实例的引用。这样的电话是这样的:
GetObject , "ProjectName.ClassName" 'Note nothing at all is passed for the first argument'
但是,如果你尝试这样做,你会立刻得到一个运行时错误。这是文档所指的不适用于使用VB6创建的类的用例。
这不起作用的原因是由于GetObject
如何发挥其魔力。当省略第一个参数时,它会尝试通过查询运行对象表(ROT)(一个包含运行COM对象的机器范围查找表)来返回现有对象实例。问题是对象必须被创建它们的进程显式注册到运行对象表中,以便其他进程可以访问--VB6运行时不会在ROT中注册ActiveX EXE类,因此GetObject
无法检索对已经运行的实例的引用。
完美答案,谢谢。我总是告诉人们RT * M,所以这是我自己的药的味道! GetObject(,“ProjectName.ClassName)会导致错误429,”ActiveX组件无法创建对象“,我想这实际上是我的项目和类设置阻止创建EXE的多个实例 – MarkJ 2009-05-28 08:55:05