4

我有一个Visual Basic 6.0应用程序,它使用了几个用.NET编写的组件。当 Windows 关闭时,应用程序必须正常关闭。问题是,如果代码的 .NET 部分显示一个窗口,应用程序会显示消息“无法退出”并且无法退出。(然后由操作系统终止。)

我设法在一个简化的应用程序中重现了这一点。

.NET 代码创建一个WPF窗口并使用 ShowDialog() 显示它:

[Guid("5F3D0B23-2196-4082-B9DE-B208C61FE89F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComShutdownTest
{
    [DispId(1)]
    void RunTest();
}

[Guid("E6613EDD-D51B-42c0-AA5B-5961AB28D063")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ShutdownTest")]
public class ShutdownTest : IComShutdownTest
{
    public ShutdownTest() 
    {  }

    public void RunTest()
    {
        TestWindow testWindow = new TestWindow();
        bool? dialogResult = testWindow.ShowDialog();
    }
}

正如您所看到的 .NET 调用阻塞(并且位于 GUI 线程上),我怀疑这可能是问题的根源,但我不能让所有调用都成为非阻塞的。我会假设当操作系统关闭时,所有打开的应用程序窗口都会被终止。

Visual Basic 6.0 应用程序通过单击按钮加载和显示 .NET 表单。

Private Sub ButtonTest_Click()

    LogEventToFile "Starting"
    Dim dotNetTestObject As ShutdownTest

    LogEventToFile "Creating"
    Set dotNetTestObject = New ShutdownTest

    LogEventToFile "Running"
    dotNetTestObject.RunTest

    LogEventToFile "Done"

End Sub

如果在屏幕上显示 .NET 表单时尝试关闭 PC,则会失败。“无法退出”消息框如下所示

要重新创建它,您必须将程序集标记为COM可见(在文件中assemblyinfo.cs):

[assembly: ComVisible(true)]

并且您必须将 Project->Properties>Build 选项卡设置为“Register for COM interop”

我还注册了编译的程序集:

regasm ShutdownTestLibrary.dll /tlb ShutdownTestLibrary.tlb

我该如何解决这个问题?

4

3 回答 3

1

如果您在任何窗口上调用 ShowDialog(),它会在该线程上阻塞,直到窗口关闭(从用户或代码)。

您可能必须在 COM 接口上创建一个方法来关闭.NET中的窗口,或者以某种方式在 Visual Basic 中获取窗口句柄来关闭窗口。

于 2009-08-10T16:39:23.820 回答
0

您可以尝试将父窗口作为.NET方法的参数,这样当父窗口尝试关闭时,.NET 组件就会收到通知。

public void RunTest(IWin32Window owner)
{
    TestWindow testWindow = new TestWindow();
    bool? dialogResult = testWindow.ShowDialog(owner);
}

在您的 Visual Basic 6.0 代码中:

Call dotNetTestObject.RunTest(Me.hWnd)
于 2009-09-11T11:22:53.587 回答
0

以下其中一项应该可以解决您的问题:

  • 确保您的.NET窗口设置了文本/名称属性。我知道这有时会导致这样的问题。
  • 将 .NET 窗口的所有者设置为您的 Visual Basic 窗口。使用 SetParent 中的函数user32.dll
  • 连接到 .NET 库中的 Microsoft.Win32.SystemEvents.SessionEnding 并关闭窗口。
于 2009-08-11T13:12:25.820 回答