【问题标题】:How might VB6 prevent COM events being delivered (.net -> VB6 via COM)?VB6 如何阻止传递 COM 事件(.net -> VB6 via COM)?
【发布时间】:2011-07-13 10:56:57
【问题描述】:

所以我正在用 C# 编写一个组件,其中包含需要通过 COM 向 VB6 公开的事件。

我已经完成了here 列出的所有步骤,并且事件本身运行良好

但是,应用程序机制中的某些东西意味着有时 COM 事件未传递(当多个事件连续触发时,只有第一个事件通过) .在.net 端作为事件引发之前以及在 VB 端处理它之后,我已经进入了跟踪数据的阶段。它们不仅被排队或乱序传送(将(更多)可接受),它们被提出但未被接收。所有事件都是从同一个 .net 线程引发的。 当我单步执行代码时,它们都已正确交付;在一个简单的测试应用程序中,它们都可以“快速”交付。

因此,VB 应用程序的某些其他部分似乎阻止了这些事件的传递。我应该从哪里开始寻找?例如,DoEvent 是否会产生意想不到的副作用?

编辑:澄清上述只有第一批通过。

编辑:重述案例(最初认为 COM 包装器是问题所在)

【问题讨论】:

    标签: .net com vb6


    【解决方案1】:

    您的 VB6 代码很可能在公寓中运行,因此必须运行消息泵来接受传入事件。您的 .Net 对象将引发一个 COM 事件,这会向您的 VB6 组件发送一条消息并处理该消息。如果 COM 子系统正在使用 SendMessageTimeout,那么引发的事件可能会被丢弃,因为您的 VB6 代码处理它们的速度太慢 - 但通常您会收到一个错误,抱怨如果某些东西被占用,则无法访问远程客户端。 一般来说,在 COM 事件处理程序中做绝对最小值是个好主意。这通常意味着提出自己的事件或向自己发布自己的消息。这是为了防止占用远程客户端线程。因此,我建议将您的事件处理程序限制为仅在您的 VB6 代码中定义的新事件上调用 RaiseEvent。确保您的 VB6 的其余部分是面向事件的,并且应该可以正常工作。

    【讨论】:

    • 我会试一试并报告 - 但是 Vb6 事件不是同步的吗?在这种情况下,远程线程仍将被绑定以响应次要事件?
    • 没有变化。 VB6 的其余部分不是面向事件的;除了将其重写为面向事件之外,还有其他策略吗?
    • 我修改了我的代码,以便事件处理程序只记录收到的消息,以确保它不是超时问题;没有喜悦。同样的问题。
    【解决方案2】:

    经过 6 天的调试后,我得出了解决方案:当您处于调试模式下的断点时,COM 事件只是被装箱而不是传递。我看到的是两件事的结合:

    1. 在第一个事件之后假定的主编程循环应该继续执行它的事情;因此,当其他事件稍后到达时,我们不再调用“DoEvents”来允许它们进入主线程;他们被拖延到了无关紧要的地步。
    2. 我所有诊断情况的努力都归结为,在某些时候,在代码中放置一个断点以查看发生了什么/单步执行/添加新代码到输出变量等。如果我在断点时事件已交付,事件只是在没有排队的情况下被分箱。

    希望这可以避免其他人在这样一个愚蠢的问题上浪费这么多时间......

    【讨论】:

    • 很高兴你知道了!所以解决方案是让主 VB 编程循环在第一个事件之后继续期待更多事件?
    • 本质上 - 事件不止一种类型,所以我只是告诉它等到正确的类型(而不是等待第一个到达)。令人沮丧的是,我已经意识到这是必要的——如果我在尝试调试问题之前继续这样做,我会省去很多麻烦sobs
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 2010-09-21
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2013-06-07
    • 2012-08-21
    相关资源
    最近更新 更多