2017-06-23 3 views
0

Je suis en train de développer un programme qui vérifie si l'application Windows Form est connectée à Internet ou non.COMException s'est produite dans IConnectionPoint Unadvise()

mon code, je basé à partir du lien suivant:

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

Je reçois ce System.Runtime.InteropServices.COMException dans la Unadvise() méthode de classe IConnectionPoint et Je ne suis pas sûr de savoir pourquoi.

Voici les informations supplémentaires de l'exception:

Il n'y a pas de connexion pour cet ID de connexion (Exception de HRESULT: 0x80040004 (OLE_E_NOCONNECTION))

Voici la méthode où Advise() est appelé:

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

h avant est la méthode où Unadvise() est appelé:

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

Et voici le constructeur et l'événement qui appelle les deux méthodes ci-dessus:

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

Est-ce que quelqu'un sait à pourquoi je suis obtenir cette exception?

+0

Détritus Codeproject.com typique sans la clause de non-responsabilité "ne fonctionne que sur ma machine"., Faites-le de la bonne façon, utilisez + = pour vous abonner aux événements. Donc nlm.NetworkConnectivityChanged + = YourMethod; –

+0

Il ne semble pas y avoir de délégué ** NetworkConnectivityChanged ** pour la classe ** INetworkListManager **. Ce que j'ai fait a été d'implémenter le ** INetworkListManagerEvents ** dans la classe contenant Advise() et Unadvise() et implémenté le ** ConnectivityChanged() ** dans la classe. Cela causera-t-il un problème? –

Répondre

0

Je vois quel est le problème maintenant!

Une fois mise au point, je l'ai remarqué que lorsque Application.Exit() est exécuté, il appelle à nouveau l'événement SQLiteForm_FormClosing. Puisque le Unadvise() est déjà exécuté, il lève l'exception OLE_E_NOCONNECTION.

J'ai résolu ce problème en déplaçant le Application.Exit() au SQLiteForm_FormClosed événement en tant que tel:

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

De cette façon, il ne sera pas appeler le plus événement SQLiteForm_FormClosing depuis la forme est déjà fermé