VB6事件传递布尔参数';s总是';true';在C#中

本文关键字:true 总是 事件 布尔 参数 VB6 | 更新日期: 2023-09-27 18:21:06

我的问题很简单,我在VB6库中声明了一个事件,该事件传递了一个布尔参数:

Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)

我已经多次将我的c#代码连接到此事件,但奇怪的是,我的测试部门和其他几个人注意到,尽管VB6在aBadPIN设置为false的情况下引发了此事件,但c#事件处理程序将其接收为true。它不一致,所以这是"那些"问题之一,但我在互联网上找不到任何帮助。

我发现,如果我定义了一个新的事件,将bool转换为字节并发送,然后在c#中将其转换回,这就解决了那些有问题的机器上的问题。然而,我真的不想这样做,因为我必须对在我的COM和.Net库之间封送的每一个bool都这样做(而且有很多)。

我在某个地方也读到过一个已知的错误(至少在C++中),你必须强制EAX寄存器为255才能正确地表示false,但我以前从未遇到过这个问题,坦率地说,我不知道从哪里开始在VB6中这样做。

任何想法都会很棒!

更新:日志记录显示,当出现此问题时,引发事件的调用会在c#事件处理程序启动之前将控制权返回给VB6代码。这是怎么回事?

更新:在引发代码退出后仍然看到事件处理程序接收事件,但尝试封送更改,但无效。时间限制会迫使我添加一个包装器。

VB6事件传递布尔参数';s总是';true';在C#中

很抱歉,问题并不像VB6世界中的逐位布尔运算那么简单。

如果问题是封送,那么.NET制作的互操作DLL是否可能与其相应的VB6 DLL不同步?(顺便说一句,你熟悉VB6中的二进制兼容性设置吗?)

为了好玩,我做了以下事情——请让我知道这组简单的项目是否是您正在跟踪的编码或编组问题的代表性模型。如果这个问题是编组问题,那么通过c#和vb6项目的简化版本来跟踪它可能会有所帮助。

使用VB6,我创建了一个简单的ActiveX DLL(项目名为LibBoolBuster),其中包含一个名为BoolBuster:的类

Public Event WriteComplete(ByVal aCommsOk As Boolean, ByVal aBadPIN As Boolean)
Public Sub DoIt(ByVal Mode As Integer)
    RaiseEvent WriteComplete(CBool(Mode And 1), CBool(Mode And 2))   
End Sub

使用VS2003(旧的.NET,但应该仍然适用),我创建了一个简单的C#Windows应用程序,有一个带有四个按钮的窗体,并参考了上面的VB6 ActiveX DLL。我在访问VB6 DLL的表单中创建了一个成员:

public LibBoolBuster.BoolBuster vb6Obj = new LibBoolBuster.BoolBuster();

通过互操作的DLL是LibBoolBuster;类BoolBuster有活动和DoIt成员。在表单initialize中,事件连接是这样完成的:

vb6Obj.WriteComplete += new LibBoolBuster.__BoolBuster_WriteCompleteEventHandler(vb6Obj_WriteComplete);

WriteComplete事件处理程序是以下表单的成员:

private void vb6Obj_WriteComplete ( System.Boolean aCommsOk  , System.Boolean aBadPIN )
{
    MessageBox.Show(aCommsOk.ToString() + ", " + aBadPIN.ToString());           
}

每个按钮点击事件处理程序对DoIt:进行简单调用

vb6Obj.DoIt(0);

(以及vb6Obj.DoIt(1)、vb6Obj.DoIt(2)等)

非常简单的项目:点击一个按钮,调用DoIt,触发事件WriteComplete。我试了一下,一切如愿以偿。


仔细观察VB6侧。您表示事件是用引发的

RaiseEvent WriteComplete(aCommsReceived, Not (aIsAcknowledged))

请确保aIsAcknowledged仅为0或-1;否则你将得不到你所期望的结果。

VB6布尔运算符都是逐位的;即(Not 1)导致-2不为零。

此外,在VB6中,当从integer转换为Boolean时,任何非零整数都将映射为True——只有零变为false。