2014-02-13 34 views
3

我創建了下面的測試場景來跟蹤與VB6-WPF互操作的一個錯誤:WPF的互操作VB6,定時器運行時錯誤

有是一個.NET WPF DLL顯示一個文本框的形式。該文本框不處理鍵盤輸入 - 沒有數據綁定,沒有事件處理程序。 DLL是COM可見的。

VB6.exe調用DLL ShowWindow函數來顯示WPF表單。當我在文本框中鍵入任何鍵時,它會在VB應用程序中導致「運行時錯誤」6「溢出」錯誤。該錯誤發生在Timer1事件的「dVal = 0」行中。

我猜錯誤發生是因爲未處理的鍵盤事件冒泡到VB6應用程序。如果WPF事件泡到VB6?爲什麼問題出現在計時器中?爲什麼只有在設置雙變量時纔會發生?如果「dVal = 0」行不存在,則不會發生這種情況。有什麼想法嗎?從公共類

C#代碼顯示的窗口:

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> 

VB6代碼:

Option Explicit 

Dim IFace As NetFormIFace 

Private Sub Command1_Click() 
    IFace.ShowWindow1 
End Sub 

Private Sub Form_Load() 
    Set IFace = New NetFormIFace 
    Timer1.Interval = 50 
    Timer1.Enabled = True 
End Sub 

Private Sub Timer1_Timer() 
    Dim iVal As Integer 
    Dim dVal As Double 

    iVal = 0 ' Does not cause an error 
    dVal = 0 ' Causes an error 
End Sub 

回答

1

你要創建一個無模式的WPF彈出窗口,它運行在一個非託管VB6應用程序的消息循環。這裏有一些規則:Sharing Message Loops Between Win32 and WPF。即使您設法在VB6端實現了消息循環要求,我也不確定這對您的具體情況是否有所幫助。

理想情況下,您應該在VB6端創建一個非託管的Win32彈出窗口,並使用HwndSource來託管您窗口內的WPF內容。檢查Walkthrough: Hosting WPF Content in Win32

或者,您可以嘗試將WPF複合控件公開爲VB6的ActiveX控件。首先,您需要確保它在VB.NET WinForms UserControl中運行,請檢查Walkthrough: Hosting a WPF Composite Control in Windows Forms。然後,將WinForms UserControl作爲ActiveX控件向公開。我可能會走這條路。

+1

接受此作爲答案,因爲我同意共享消息循環是問題。 –

0

我們發現,如果我們在訪問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