COMException 发生在 IConnectionPoint Unadvise()
COMException occurred in IConnectionPoint Unadvise()
我正在开发一个程序来检查 Windows 表单应用程序是否已连接到互联网。
我的代码基于以下 link:
https://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
我在 class 的 Unadvise() 方法中得到这个 System.Runtime.InteropServices.COMException IConnectionPoint 我不确定为什么。
异常的附加信息如下:
There is no connection for this connection ID (Exception from 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();
}
有谁知道我为什么会收到此异常?
我明白是什么问题了!
调试时,我注意到当执行 Application.Exit() 时,它会调用 SQLiteForm_FormClosing 事件再次发生。由于 Unadvise() 已经执行,它抛出 OLE_E_NOCONNECTION 异常。
我通过将 Application.Exit() 移动到 SQLiteForm_FormClosed 事件解决了这个问题:
private void SQLiteForm_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
这样它就不会再调用 SQLiteForm_FormClosing 事件,因为表单已经关闭。
我正在开发一个程序来检查 Windows 表单应用程序是否已连接到互联网。
我的代码基于以下 link:
https://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
我在 class 的 Unadvise() 方法中得到这个 System.Runtime.InteropServices.COMException IConnectionPoint 我不确定为什么。
异常的附加信息如下:
There is no connection for this connection ID (Exception from 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();
}
有谁知道我为什么会收到此异常?
我明白是什么问题了!
调试时,我注意到当执行 Application.Exit() 时,它会调用 SQLiteForm_FormClosing 事件再次发生。由于 Unadvise() 已经执行,它抛出 OLE_E_NOCONNECTION 异常。
我通过将 Application.Exit() 移动到 SQLiteForm_FormClosed 事件解决了这个问题:
private void SQLiteForm_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
这样它就不会再调用 SQLiteForm_FormClosing 事件,因为表单已经关闭。