C# WPF-VB6互操作导致计时器运行时错误
我创建了以下测试场景来跟踪VB6-WPF互操作的错误: 有一个.Net WPF DLL,它显示带有文本框的表单。文本框不处理键盘输入-没有数据绑定,没有事件处理程序。DLL是COM可见的 VB6.exe调用DLL ShowWindow函数以显示WPF表单。当我在文本框中键入任何键时,它会在VB应用程序中导致“运行时错误'6'溢出”错误。该错误发生在计时器1事件的“dVal=0”行中 我猜发生错误是因为未处理的密钥事件被冒泡到VB6应用程序。WPF事件是否应该冒泡到VB6?为什么问题会出现在计时器中?为什么只有设置了双变量时才会发生这种情况?如果“dVal=0”行不存在,则不会发生这种情况。有什么想法吗 显示窗口的公共类的C#代码:C# WPF-VB6互操作导致计时器运行时错误,c#,wpf,vb6,com-interop,C#,Wpf,Vb6,Com Interop,我创建了以下测试场景来跟踪VB6-WPF互操作的错误: 有一个.Net WPF DLL,它显示带有文本框的表单。文本框不处理键盘输入-没有数据绑定,没有事件处理程序。DLL是COM可见的 VB6.exe调用DLL ShowWindow函数以显示WPF表单。当我在文本框中键入任何键时,它会在VB应用程序中导致“运行时错误'6'溢出”错误。该错误发生在计时器1事件的“dVal=0”行中 我猜发生错误是因为未处理的密钥事件被冒泡到VB6应用程序。WPF事件是否应该冒泡到VB6?为什么问题会出现在计时器
public class NetFormIFace : INetFormIFace
{
public void ShowWindow1()
{
Window1 w1;
w1 = new Window1();
w1.Show();
}
}
用于窗口的XAML。未向代码中添加任何内容:
<Window x:Class="SSEC.NetForm.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Canvas>
<TextBox Height="34" Canvas.Left="35" TextWrapping="Wrap" Text="TextBox" Canvas.Top="52" Width="94" />
</Canvas>
</Window>
您正在创建一个无模式WPF弹出窗口,该窗口在非托管VB6应用程序的消息循环上运行。这里有一些规则:。我不确定这在您的特定情况下是否会有所帮助,即使您成功地在VB6端实现了消息循环要求 理想情况下,您应该在VB6端创建一个非托管Win32弹出窗口,并使用在该窗口中托管WPF内容。检查
或者,您可以尝试将WPF复合控件作为VB6的ActiveX控件公开。首先,您需要确保它在VB.NET WinForms中工作,请检查。然后,使用将WinForms
UserControl
作为ActiveX控件公开给VB6。我可能会这样做。我们发现,如果在访问GUI元素的VB6计时器例程的开头添加一行代码,则不会发生错误。在本例中,我们添加了一行来读取计时器间隔。我们将此用作临时修复,同时评估更好的方法
Private Sub Timer1_Timer()
Dim iVal As Integer
Dim dVal As Double
Dim lTemp as long
lTemp = Timer1.Interval ' The error does not occur if this (any GUI?) element is read. I don't know why.
iVal = 0 ' Does not cause an error
dVal = 0 ' Causes an error
End Sub
接受这个答案,因为我同意共享消息循环是问题所在。这是在编译VB6代码时发生的,还是仅在VB6 IDE中运行时发生的?