我正在开发一个程序来检查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();
}
有谁知道为什么我会得到这个例外?
答案 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 事件,因为表单已经关闭。