2017-06-23 12 views
0

Windowsフォームアプリケーションがインターネットに接続されているかどうかを確認するプログラムを開発しています。IConnectionPointでCOMExceptionが発生しましたUnadvise()

私は、以下のリンクから自分のコードベース:私はクラスでIConnectionPointUnadvise()方法でこのSystem.Runtime.InteropServices.COMExceptionを取得しています

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

をし、なぜ私は確信していません。

ここ方法であって

( 0x80040004(OLE_E_NOCONNECTION)HRESULTからの例外)は、この接続IDの接続がない:ここ

は、例外の追加情報であります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); 
    } 
} 

と呼ばれ、

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(); 
} 

は、私は理由として、誰を知っていEREは、Unadvise()が呼ばれる方法であり、この例外が発生していますか?

+0

典型的なCodeproject.comのジャンクは「自分のマシンでのみ動作します」という免責事項はありません。正しい方法で+ =を使用してイベントを購読してください。したがって、nlm.NetworkConnectivityChanged + = YourMethod; –

+0

** INetworkListManager **クラスの** NetworkConnectivityChanged **デリゲートが存在しないようです。私がしたのは、** INetworkListManagerEvents **をAdvise()とUnadvise()を含むクラスに実装し、クラス内で** ConnectivityChanged()**を実装したことです。それは問題を引き起こすでしょうか? –

答えて

0

私は今何が問題かを見ます!

デバッグ時に

は、私はApplication.Exit()が実行されると、それは再びSQLiteForm_FormClosingイベントを呼び出すことに気付きました。 Unadvise()は既に実行されているため、OLE_E_NOCONNECTION例外がスローされます。

私はApplication.Exit()を移動することでこれを解決したのようなイベントをSQLiteForm_FormClosed:それはフォームので、もうSQLiteForm_FormClosingイベントを呼び出すことはありません

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

その方法既に閉じられています。

関連する問題