Domanda

Ho un'applicazione che deve funzionare dopo un'altra applicazione. Questa seconda applicazione presenta un bug che impedisce la chiusura delle porte COM in circostanze specifiche.

Vorrei chiudere tutte le porte COM a livello di codice nella mia applicazione per garantire che non vengano segnalati bug relativi alle porte chiuse. È possibile se non possiedo oggetti che hanno aperto le porte COM?

Ho bisogno di una soluzione su .NET Framework, C #.

È stato utile?

Soluzione

Non esiste un modo semplice e buono:

  • Un buono è risolvere l'altra applicazione; o se ciò è impossibile, scrivere un driver di dispositivo di filtro (simile al driver del parport ma per porte seriali anziché porte parallele) che si collochi sopra il driver hardware della porta seriale e che esponga più di un punto di connessione (uno usato da l'altra applicazione, che passa al driver reale sottostante e un'altra "backdoor" utilizzata dalla propria applicazione ... il driver reale vedrebbe solo un client, ovvero il driver del filtro che si trova sopra di esso)
  • Un modo facile è quello di eseguire l'annotazione (interruzione forzata) dell'altro processo.

Altri suggerimenti

Mi sono imbattuto recentemente in questo e ho un po 'da aggiungere ... La maggior parte dei driver della porta COM " unlock " la porta quando il dispositivo è abilitato e disabilitato in Gestione dispositivi. Ciò significa che il modo (C #) per eseguire questa attività è descritto nella soluzione:

Funzione API Win32 per abilitare / disabilitare programmaticamente il dispositivo

Le informazioni che è necessario conoscere per utilizzare quella soluzione per le porte COM sono:

  1. il GUID per le porte COM: {4d36e978-e325-11ce-bfc1-08002be10318} (CLSID_Ports)
  2. il " percorso dell'istanza " della porta che si desidera ripristinare

Dato che dici di voler ripristinare tutte le porte, vorrai modificare la libreria in quell'esempio per passare su tutte le porte cambiando:

// Find the index of our instance. i.e. the touchpad mouse - I have 3 mice attached...
int index = GetIndexOfInstance(diSetHandle, diData, instanceId);
// Disable...
EnableDevice(diSetHandle, diData[index], enable);

a qualcosa del genere:

for (int index = 0; index < diData.Length; index++)
{
    EnableDevice(diSetHandle, diData[index], enable);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top