Pergunta

Eu tenho um aplicativo que o trabalho deve depois de outro aplicativo. Esta segunda aplicação tem um bug que faz com que as portas COM não deve ser fechado em circunstâncias específicas.

Eu gostaria de fechar todas as portas COM programaticamente no meu aplicativo para garantir que não haverá erros cerca fechar portas relatou. É possível se eu não próprios objetos que abriu portas?

Eu preciso de uma solução no .NET Framework, C #.

Foi útil?

Solução

Não há bom, caminho mais fácil:

  • A boa caminho é fixar o outro aplicativo; ou se isso é impossível, para escrever um driver de dispositivo de filtro (similar ao motorista parport mas para portas seriais em vez de portas paralelas) que iria se sentar em cima do controlador de hardware porta serial e que expõem mais do que um ponto de conexão (um usado por o outro aplicativo, que passa para o driver verdadeira subjacente, e outro 'porta dos fundos' usado pelo seu próprio aplicativo ... o motorista real só veria um cliente, ou seja, o driver de filtro wich senta em cima dele)
  • Um fácil forma é nuke (força terminar) o outro processo.

Outras dicas

Me deparei com este recentemente e tem um pouco para adicionar ... A maioria dos drivers de porta COM "destravar" a porta quando o dispositivo é ativado e desativado no gerenciador de dispositivos. Isto significa que o caminho (C #) para realizar essa tarefa é descrita na solução:

função da API Win32 para habilitar programaticamente / desativar o dispositivo

As informações que você precisa saber para usar essa solução para portas COM é:

  1. o GUID para portas COM: {4d36e978-E325-11CE-BFC1-08002BE10318} (CLSID_Ports)
  2. o "caminho da instância" da porta que você deseja redefinir

Uma vez que você diz que deseja redefinir todas as portas, você iria querer modificar a biblioteca em que o exemplo de varrer todas as portas, alterando:

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

para algo como isto:

for (int index = 0; index < diData.Length; index++)
{
    EnableDevice(diSetHandle, diData[index], enable);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top