Tenho uma applet que faz a leitura de cartões criptográficos, no meu caso, para assinar documentos digitalmente.
Para acessar essa applet eu uso as dlls do fabricante do leitor juntamente com as classes padrões do pacote java.security. Até aí tudo bem, está testado e funcionando, porém em um caso específico acontece um problema:
Quando eu desconecto o leitor da máquina minha aplicação exibe uma mensagem em uma label informando o usuário que ele precisa conectar a leitora e reiniciar a applet. só que, mesmo fazendo isso, a mensagem de erro permanece na tela, e debugando eu descobri que o programa tenta acessar a dll e não identifica a leitora.
O contrário também ocorre, quando eu uso a leitora normalmente, retiro e tento usar, a applet me informa que conseguiu ler tranquilamente a dll e a leitora de cartões.
Esse problema só é resolvido quando eu reinicio o browser.
O mesmo problema ocorre no site do Banco do Brasil, na seção de certificados A3.
Gostaria de saber se há uma maneira prática de esquartejar a JVM logo após o fechamento da applet (Que ocorre por exemplo quando a página é trocada), ou uma forma de fazer ela ler corretamente a dll.
Eu assino essa applet usando um certificado meu, criado com o jarsigner.
Então, peço desculpas a todo o pessoal do fórum por ter feito isso, não havia de fato lido a regra que fala que isso é inconveniente e tal, é que eu vi minha mensagem esquecida em outra página do fórum e imaginei que havia esperança de alguém saber a resposta do problema, porém, acho que ninguém sabe.
Não funciona por se tratar de uma applet, eu já tentei colocar System.exit(0); no método stop() da applet (Que é executado quando a página é trocada, etc.) mas acontece uma exception informando que esse comando não se aplica.
Agradeço pelo Link.
Já li alguns tópicos como esse, porém todos sempre chegam ao mesmo lugar: Método Stop e Destroy, onde é possível parar as Threads que o sistema possa estar rodando e finalizar qualquer vestígio necessário, mas acredito que o problema seja mesmo com a JVM, por isso se houvesse um comando tipo System.destroyVMAfterProcess(); acredito que o problema seria resolvido.
Você acessa a dll diretamente ou construiu uma dll intermediária que faz a ponte entre a dll e o applet? Se for uma dll intermediária você poderia implementar a recarga da dll usando as funções LoadLibrary/LoadLibraryEx e FreeLibrary da Win32 API.