【问题标题】:ActiveX communicationActiveX 通讯
【发布时间】:2008-10-27 14:37:56
【问题描述】:

我正在开发一个ActiveX EXE,它将特定类公开给第三方软件。这个第三方软件实例化了这个类的一个对象并使用它的方法。

奇怪的是,这个第三方软件一调用特定方法就销毁了我暴露的类的对象,但我不知道为什么会发生这种情况。

我唯一的线索是这个方法是唯一一个返回值的方法。所有其他的都是简单的“subs”,不返回任何值,当它们被调用时不会发生任何错误。

我正在使用 VB6。

你们知道为什么会这样吗?

【问题讨论】:

    标签: vb6 activex


    【解决方案1】:

    当最后一个对它的引用被删除时,你的对象会被“销毁”。那是正常的 COM 行为。还是您的对象毫无例外地死了,而第三方应用程序出现了 activex 错误?

    还有一些问题:

    • 我不知道您所说的“数据服务器”是什么意思?
    • 您可以访问第三方应用程序的源代码吗?
    • 您确定第三方应用程序包含对您的对象的引用吗?
    • 你的对象是否调用了 Class_Terminate 方法?

    编辑: 好的,当 Class_Terminate 被调用时,很明显,第三方应用程序已经删除了对您的对象的引用。

    【讨论】:

    • 它不应该被删除,因为它是第三方应用程序的数据服务器。第三方应用没有报错。
    • 我不知道你所说的“数据服务器”是什么意思。您可以访问第三方应用程序的源代码吗?您确定第三方应用程序包含对您的对象的引用吗?你的对象有没有调用 Class_Terminate 方法?
    • Jan,下面是答案: - 第三方应用程序告诉我的 activex 它需要一些数据。从 Web 服务检索数据后,我的 activex 将通过回调接口将数据发送回应用程序。 - 不,我无权访问第三方应用程序的源代码。 - 是的,我确信它包含对我的对象的引用,因为它的所有方法都可以正常工作。 - 是的,我的Class_Terminate 方法被调用了。
    【解决方案2】:

    正如 Jan 在 COM 中所说,如果没有人引用它,则终止您的对象是正常的。如果您想做某种缓存(例如保持数据库连接打开),您可以使用在 bas-module 中定义的全局变量。

    basGlobal.bas

    Global AGlobalVariable As Object
    

    Connector.cls

    Public Function GetFoo() As Object
      If AGlobalVariable Is Nothing then
        Set AGlobalVariable = ...
      End If 
      Set GetFoo = AGlobalVariable
    End Function
    

    【讨论】:

    • 我无法保留全局实例,因为当第三方应用程序销毁我的对象的实例时,我需要关闭我的应用程序。当我关闭它时,第三方应用程序会重新启动我的 activex exe。我知道这很奇怪,但是当对象被销毁时,应用程序会尝试创建另一个对象,但“抱怨”之前的 activex exe 已经在运行。这就是为什么我需要关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2019-04-06
    • 2011-08-15
    • 2018-04-01
    相关资源
    最近更新 更多