Visual Basic - Proceso asociado a un Usuario
Hola gente!!!! Tengo un programa corriendo en Windows Server 2003 con varios usuarios, agrege un codigo que controla que la aplicacion no se abra mas de 1 vez, pero si un solo usuario tiene abierto el programa el resto no puedo accederlo, porque el codigo no diferencia por usuarios. Si alguien puede tirarme alguna idea, desde ya muchas gracias. Agrego el codigo utilizado: Option Explicit Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function EnumProcesses Lib "PSAPI.DLL" (lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, lphModule As Long, ByVal cb As Long, lpcbNeeded As Long) As Long Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long Private Const PROCESS_VM_READ = &H10 Private Const PROCESS_QUERY_INFORMATION = &H400 ----Cargado en el load If EstaCorriendo("xxxxx.exe") Then resp = MsgBox("El programa está en Ejecución", vbOKOnly, "xxxx Aplicaciones") End 'Else 'MsgBox "El programa NO está en ejecución" End If Private Function EstaCorriendo(ByVal NombreAplicacion As String) As Boolean Const MAX_PATH As Long = 260 Dim lProcesses() As Long, lModules() As Long, N As Long, lRet As Long, hProcess As Long Dim sName As String NombreAplicacion = UCase$(NombreAplicacion) ReDim lProcesses(1023) As Long If EnumProcesses(lProcesses(0), 1024 * 4, lRet) Then For N = 0 To (lRet \ 4) - 1 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcesses(N)) If hProcess Then ReDim lModules(1023) If EnumProcessModules(hProcess, lModules(0), 1024 * 4, lRet) Then sName = String$(MAX_PATH, vbNullChar) GetModuleBaseName hProcess, lModules(0), sName, MAX_PATH sName = Left$(sName, InStr(sName, vbNullChar) - 1) If Len(sName) = Len(NombreAplicacion) Then If NombreAplicacion = UCase$(sName) Then EstaCorriendo = True: Exit Function End If End If End If CloseHandle hProcess Next N End If End Function También te puede interesar...
No he entendido muy bien el código que muestras, aunque la lógica para mi es muy sencilla, en la base de datos creas una tabla llamada parámetros, y en ella un campo llamado usado que se pondrá a S cuando entre un usuario. Naturalmente lo primero que hará el programa es consultar ese campo, en el caso de ser S mensaje y fuera. Cuando el usuario que está ejecutando salga el campo se pone a " " . Ayuda para un programa de visual ayuda urgente con desglosar paquete de datos entrante a mscomm |