IConnectionPoint Unadvise()中发生COMException

时间:2017-06-23 10:19:40

标签: c# .net winforms interop comexception

我正在开发一个程序来检查Windows窗体应用程序是否已连接到互联网。

我的代码来自以下链接:

https://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of

我在 IConnectionPoint Unadvise()方法中获得了 System.Runtime.InteropServices.COMException ,而我&# 39;我不确定为什么。

以下是例外的附加信息:

  

此连接ID没有连接(来自HRESULT的异常:   0x80040004(OLE_E_NOCONNECTION))

以下是调用 Advise()的方法:

private INetworkListManager nlm;
private IConnectionPoint icp;
private int cookie = 0;

public void AdviseNetworkListManager()
{
    try
    {
        IConnectionPointContainer icpc = (IConnectionPointContainer)nlm;
        Guid guid = typeof(INetworkListManagerEvents).GUID;
        icpc.FindConnectionPoint(ref guid, out icp);
        icp.Advise(this, out cookie);
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}

以下是调用 Unadvise()的方法:

public void UnadviseNetworkListManager()
{
    icp.Unadvise(cookie);
}

以下是调用上述方法的构造函数和事件:

private NetworkHelper netHelper;

public SQLiteForm()
{
    InitializeComponent();
    SQLiteDatabase.ConnectDB();
    DBHelper.ConnectDB();
    netHelper = new NetworkHelper();
    netHelper.AdviseNetworkListManager();
    netHelper.DoBackgroundWork += backgroundWorker_DoWork;
}

private void SQLiteForm_FormClosing(object sender, FormClosingEventArgs e)
{
    netHelper.UnadviseNetworkListManager();
    DBHelper.DisconnectDB();
    SQLiteDatabase.DisconnectDB();
    Application.Exit();
}

有谁知道为什么我会得到这个例外?

1 个答案:

答案 0 :(得分:0)

我现在看到了问题所在!

调试后,我注意到当执行 Application.Exit()时,它再次调用 SQLiteForm_FormClosing 事件。由于 Unadvise()已经执行,因此会抛出OLE_E_NOCONNECTION异常。

我已经通过将 Application.Exit()移动到 SQLiteForm_FormClosed 事件来解决这个问题:

private void SQLiteForm_FormClosed(object sender, FormClosedEventArgs e)
{
    Application.Exit();
}

这样就不再调用 SQLiteForm_FormClosing 事件,因为表单已经关闭。