VB6如何防止COM事件被传递(.net - > VB6通过COM)?

时间:2011-03-11 11:55:39

标签: .net com vb6

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

我已经采取了列出的所有步骤here,并且事件本身正常

然而,应用程序机制中的某些东西意味着有时COM事件未被传递(当多个事件连续触发时,只有第一个事件通过) 。我已经进入了跟踪数据之前的阶段,直到它在.net端被提升为事件并且在VB端被处理之后立即进行。它们不仅排队等候,或者不按顺序传送(会(更多)接受),它们被提出但没有收到。所有事件都是从同一个.net线程引发的。 当我单步执行代码时,它们都正确传递;在一个简单的测试应用程序中,他们甚至“快速”地交付。

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

编辑:澄清了上述情况,只有批次中的第一批才能通过。

编辑:重述案例(原来是COM包装器被认为是问题)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

所以经过6天的调试后,我得出了解决方案:当你在调试模式下处于断点时,COM事件只是分箱并且没有交付。我所看到的是两件事的组合:

  1. 主要编程循环在第一个事件之后假定它应该继续并且做它的事情;因此,当其他事件后来到达时,我们不再调用“DoEvents”来允许它们进入主线程;他们被推迟到与他们无关的地步。
  2. 我在诊断情况时所做的一切努力都归结为,在某些时候,在代码中设置一个断点,以查看正在进行的操作/逐步执行/为输出变量添加新代码等。如果我处于断点时事件已经发布,事件只是在没有排队的情况下被分类。
  3. 希望这可以拯救别人在这样一个愚蠢的问题上浪费这么多时间......