Me deparei com a necessidade de controlar a criação de uma única instância no computador de um programa ao desenvolver um software de sincronização de dados.
Achei algum material na internet que se referia aos mutex, que fazem a "mágica" sozinhos. Descobri também que em se tratando da plataforma .NET há classes para tratar disso, porém como meu programa está em VB 6 precisei de um pouco mais de pesquisa.
Para fazer a coisa funcionar, em um módulo do programa, acrescente as seguintes instruções:
Obviamente, substitua NOME_DA_APLICACAO pelo nome da sua própria.
Agora no Form_Load ou na Sub Main() da sua aplicação, defina as seguintes instruções:
Mais um pouco de pesquisa e descobri que bastava usar a seguinte sintaxe na declaração do nome do sistema:
Saudações!
Achei algum material na internet que se referia aos mutex, que fazem a "mágica" sozinhos. Descobri também que em se tratando da plataforma .NET há classes para tratar disso, porém como meu programa está em VB 6 precisei de um pouco mais de pesquisa.
Para fazer a coisa funcionar, em um módulo do programa, acrescente as seguintes instruções:
Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 'Constante para testar se Public Const ERROR_ALREADY_EXISTS = 183& 'Declaração das variáveis da aplicação Public Const AppVer = "NOME_DA_APLICACAO" Public mutexvalue As Long
Obviamente, substitua NOME_DA_APLICACAO pelo nome da sua própria.
Agora no Form_Load ou na Sub Main() da sua aplicação, defina as seguintes instruções:
mutexvalue = CreateMutex(ByVal 0&, 1, AppVer) ' se existir algum erro na criação do mutex é sinal que ' seu aplicativo já está rodando If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then MsgBox "NOME_DA_APLICACAO já se encontra em execução." 'Encerre a aplicação através de sua referência CloseHandle mutexvalue End IfConsegui fazer funcionar na máquina de desenvolvimento e em alguns cientes, porém esbarrei no Terminal Service. Como o TS separa as sessões de usuário, o mutex não conseguia entender que os aplicativos sendo rodados na sessão A e na sessão B são o mesmo e deixava mais de uma cópia rodando.
Mais um pouco de pesquisa e descobri que bastava usar a seguinte sintaxe na declaração do nome do sistema:
Public Const AppVer = "Global\NOME_DA_APLICACAO"Global faz com que o aplicativo seja identificado em qualquer sessão do Terminal Service pela mesma referência. Assim o mutex passou a funcionar.
Saudações!