gpt4 book ai didi

com - GetObject 和 VB6 ActiveX exe

转载 作者:行者123 更新时间:2023-12-04 06:29:54 26 4
gpt4 key购买 nike

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调用不会引发错误:

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'

但是,如果您尝试这样做,您将立即收到运行时错误。这是文档在说 GetObject 时所指的用例。不适用于用 VB6 创建的类。

这不起作用的原因是 GetObject发挥它的魔力。当第一个参数被省略时,它会尝试通过查询运行对象表 (ROT) 来返回现有对象实例,ROT 是一个包含正在运行的 COM 对象的机器范围的查找表。问题是对象必须由创建它们的进程在运行对象表中显式注册才能被其他进程访问 - VB6 运行时不会在 ROT 中注册 ActiveX EXE 类,因此 GetObject无法检索对已运行实例的引用。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com