Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Evitar que se ejecute un .exe

Estas en el tema de Evitar que se ejecute un .exe en el foro de Visual Basic clásico en Foros del Web. Buen dia a todos...otra vez molestando.... Miren, realize un proyecto en el cual a la hora de ejecutarse se auto-copia, en la carpeta de windows ...
  #1 (permalink)  
Antiguo 16/06/2005, 13:37
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años
Puntos: 0
Exclamación Evitar que se ejecute un .exe

Buen dia a todos...otra vez molestando....

Miren, realize un proyecto en el cual a la hora de ejecutarse se auto-copia, en la carpeta de windows con otro nombre, esta misma copia se coloca en el run del registro, para ejecutarse al inicio...

por ejemplo:

Mi ejecutable original, se llama CFS.exe y la copia se llama cfsb1.exe, entonces en el run coloco la direccion de la copia.....esto lo hice, por si eliminan el originas CFS.exe, mi programita siga vivo con la copia cfsb1.exe.

Pero mi problema es que , en caso de no eliminar el original (CFS.exe), pasa lo siguiente;

1.-El usuario ejecuta el programa ok
2.- el programa se autocopia y se coloca en el run ok
3.- si el usuario reinicia su pc y al iniciar, la copia se activa (cfsb1.exe) y se mantiene activa.
4.- el usuario ejecuta el original (CFS.exe) y tengo los dos programas ejecutandose........ .

como evito que se ejecute un .exe, si el otro .exe se esta ejecutando;
por ejemplo;

si cfsb1.exe se esta ejecutando, al abrir CFS.exe, me mande un mensaje, el programa esta activo,,,,,,,y si CFS.exe se esta ejecutando , evitar que cfsb1.exe se ejecute y mande el mismo mensaje

espero me haya explicado un poco

Bueno, pues gracias por su atencion y espero me puedan ayudar,
  #2 (permalink)  
Antiguo 16/06/2005, 14:50
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Podes usar un mutex con nombre.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 16/06/2005, 15:08
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años
Puntos: 0
gracias por tu ayuda pero no logro entenderlo.... me podrias explicar un poquito....gracias
  #4 (permalink)  
Antiguo 16/06/2005, 15:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Hay una funcion de la API de Windows llamada CreateMutex, uno de sus parametros es el nombre del mutex, si los dos programas intentan abrir el mutex usando el mismo nombre solo el primero de los dos lo lograra y el otro se dara cuenta que ya esta en ejecucion.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 16/06/2005, 15:12
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 19 años, 6 meses
Puntos: 3
Y porque no eliminas el primer archivo con el segundo?
Lo que puedes hacer es guardar en un archivo el path de donde se ejecuto el primer programa, copias y ejecutas el segundo programa, el segundo programa leera el archivo y eliminara el primero.

No es mas facil pa' donde
  #6 (permalink)  
Antiguo 16/06/2005, 15:14
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Cita:
Iniciado por RadicalEd
Y porque no eliminas el primer archivo con el segundo?
Lo que puedes hacer es guardar en un archivo el path de donde se ejecuto el primer programa, copias y ejecutas el segundo programa, el segundo programa leera el archivo y eliminara el primero.

No es mas facil pa' donde
Esa es una forma de evitar el problema.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 16/06/2005, 15:34
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años
Puntos: 0
mil gracias por su ayuda, voy a investigar como funciona la api, hasta pronto
  #8 (permalink)  
Antiguo 16/06/2005, 16:33
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años
Puntos: 0
hola de nuevo...Miren encontre este codigo que crea un mutex (creo)..ese es el problema....no lo entiendo.....(soy novato)......me lo podrian explicar un poquito, para saber lo que hace ya que si solo lo uso sin saber su logica jamas voy a progresar...

Private Declare Function CreateMutex Lib "kernel32" Alias _
"CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, _
ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

Private Const ERROR_ALREADY_EXISTS = 183&

Public Function InIDE() As Boolean
Debug.Assert Not TestIDE(InIDE)
End Function

Private Function TestIDE(Test As Boolean) As Boolean
Test = True
End Function

Public Function MutexCreate(sName As String) As Boolean
Dim sa As SECURITY_ATTRIBUTES

If Not InIDE Then
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0
sa.nLength = Len(sa)

Call CreateMutex(sa, 1, sName)

MutexCreate = (Err.LastDllError <> ERROR_ALREADY_EXISTS)
Else
MutexCreate = True
End If
End Function

Private Sub Form_Load()
If MutexCreate(App.Title) Then
'Continue execution...
Else
MsgBox "Already active!"
End If

End Sub


Bueno gracias por su atencion
  #9 (permalink)  
Antiguo 11/07/2005, 18:04
Avatar de SlipkBlack  
Fecha de Ingreso: julio-2005
Mensajes: 2
Antigüedad: 18 años, 9 meses
Puntos: 0
Prueva este codigo tio.
'
Option Explicit

Private Sub Command1_Click()
' Aqui simplemente un button con la instrucion Terminar
End
End Sub

Private Sub Form_Load()
'Aqui se verifica al iniciar el programa que el programa no este en ejecucion en caso de que lo este mandara un mensage de error y se cerrara el programa que trataba de iniciar sin afectar al primero.

If App.PrevInstance Then
Call MsgBox("El programa ya se esta ejecutando.", vbExclamation, "Error")
End
End If

End Sub
' Enjoy this code
  #10 (permalink)  
Antiguo 11/07/2005, 23:16
Avatar de darkhack  
Fecha de Ingreso: marzo-2005
Mensajes: 654
Antigüedad: 19 años
Puntos: 3
Cita:
Iniciado por RadicalEd
Y porque no eliminas el primer archivo con el segundo?
Lo que puedes hacer es guardar en un archivo el path de donde se ejecuto el primer programa, copias y ejecutas el segundo programa, el segundo programa leera el archivo y eliminara el primero.

No es mas facil pa' donde
por que mejor no utilizas el "tskill" y terminas el processo de el primer exe
__________________
Dios solo nos dio el 0 y el 1 pero con eso hemos hecho maravillas
1er dia te espantas, 2° te desesperas,3° buscas ayuda y 4°....Adios
  #11 (permalink)  
Antiguo 11/07/2005, 23:47
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
en un modulo pega este codigo:


' Start Module code
Option Explicit
Const MAX_PATH& = 260

Declare Function TerminateProcess _
Lib "kernel32" (ByVal ApphProcess As Long, _
ByVal uExitCode As Long) As Long
Declare Function OpenProcess Lib _
"kernel32" (ByVal dwDesiredAccess As Long, _
ByVal blnheritHandle As Long, _
ByVal dwAppProcessId As Long) As Long
Declare Function ProcessFirst _
Lib "kernel32" Alias "Process32First" _
(ByVal hSnapshot As Long, _
uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext _
Lib "kernel32" Alias "Process32Next" _
(ByVal hSnapshot As Long, _
uProcess As PROCESSENTRY32) As Long
Declare Function CreateToolhelpSnapshot _
Lib "kernel32" Alias "CreateToolhelp32Snapshot" _
(ByVal lFlags As Long, _
lProcessID As Long) As Long
Declare Function CloseHandle _
Lib "kernel32" (ByVal hObject As Long) As Long

Private Type LUID
lowpart As Long
highpart As Long
End Type

Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
LuidUDT As LUID
Attributes As Long
End Type

Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Declare Function GetVersion _
Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess _
Lib "kernel32" () As Long
Private Declare Function OpenProcessToken _
Lib "advapi32" (ByVal ProcessHandle As Long, _
ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue _
Lib "advapi32" Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, _
ByVal lpName As String, _
lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges _
Lib "advapi32" (ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, _
NewState As TOKEN_PRIVILEGES, _
ByVal BufferLength As Long, _
PreviousState As Any, _
ReturnLength As Any) As Long

Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * MAX_PATH
End Type
'---------------------------------------
Public Function KillApp(myName As String) As Boolean
Const TH32CS_SNAPPROCESS As Long = 2&
Const PROCESS_ALL_ACCESS = 0
Dim uProcess As PROCESSENTRY32
Dim rProcessFound As Long
Dim hSnapshot As Long
Dim szExename As String
Dim exitCode As Long
Dim myProcess As Long
Dim AppKill As Boolean
Dim appCount As Integer
Dim i As Integer
On Local Error GoTo Finish
appCount = 0

uProcess.dwSize = Len(uProcess)
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
rProcessFound = ProcessFirst(hSnapshot, uProcess)
Do While rProcessFound
i = InStr(1, uProcess.szexeFile, Chr(0))
szExename = LCase$(Left$(uProcess.szexeFile, i - 1))
If Right$(szExename, Len(myName)) = LCase$(myName) Then
KillApp = True
appCount = appCount + 1
myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
If KillProcess(uProcess.th32ProcessID, 0) Then
'For debug.... Remove this
' MsgBox "Instance no. " & appCount & " of " & szExename & " was terminated!"
End If

End If
rProcessFound = ProcessNext(hSnapshot, uProcess)
Loop
Call CloseHandle(hSnapshot)
Exit Function
Finish:
MsgBox "Error!"
End Function

'Terminate any application and return an exit code to Windows.
Function KillProcess(ByVal hProcessID As Long, Optional ByVal exitCode As Long) As Boolean
Dim hToken As Long
Dim hProcess As Long
Dim tp As TOKEN_PRIVILEGES


If GetVersion() >= 0 Then

If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) = 0 Then
GoTo CleanUp
End If

If LookupPrivilegeValue("", "SeDebugPrivilege", tp.LuidUDT) = 0 Then
GoTo CleanUp
End If

tp.PrivilegeCount = 1
tp.Attributes = SE_PRIVILEGE_ENABLED

If AdjustTokenPrivileges(hToken, False, tp, 0, ByVal 0&, ByVal 0&) = 0 Then
GoTo CleanUp
End If
End If

hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, hProcessID)
If hProcess Then

KillProcess = (TerminateProcess(hProcess, exitCode) <> 0)
' close the process handle
CloseHandle hProcess
End If

If GetVersion() >= 0 Then
' under NT restore original privileges
tp.Attributes = 0
AdjustTokenPrivileges hToken, False, tp, 0, ByVal 0&, ByVal 0&

CleanUp:
If hToken Then CloseHandle hToken
End If

End Function

y en el formulario

Private Sub Form_Load()
If KillApp("CFS.exe") = True Then 'lo cierra y te avisa sino le quitas los msgbox
MsgBox "Archivo quitado de Memoria"
Else
MsgBox "No encontrado en Memoria"
End If
End Sub
'o bien colocas el codigo del formulario en un timer

Última edición por LeandroA; 11/07/2005 a las 23:52
  #12 (permalink)  
Antiguo 12/07/2005, 13:48
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Tambien podria sera asi
En las FAQ's hay como saber si un proceso esta activo.
Entonces cuando ejecutas una de las aplicaciones ve si el otro esta activo y se autocierra.......
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 13/07/2005, 11:43
 
Fecha de Ingreso: julio-2005
Ubicación: València
Mensajes: 1
Antigüedad: 18 años, 9 meses
Puntos: 0
Información Re: ris ras

Y si usamos el Scripting ?

Tengo una duda, por qué quieres que la copia tenga un nombre diferente ?
(en este ejemplo la copia tiene el mismo nombre que el original)

'-----------------------------
On Error Resume Next

Dim Burbuja
Dim Nombre_Programa
Dim Dir
Dim Z

Dir = "C:\WINDOWS\" 'he puesto que el directorio es WINDOWS porque tu dijiste que lo es. Si no es windows simplemente cambialo

Nombre_Programa = "NombreDeEstePrograma.exe"

'Aqui el programa ejecuta su código

'Al final crearemos una entrada en el registro:
'para saber si se ha copiado


'vemos si el archivo ya se ha copiado
Set Burbuja = CreateObject("WScript.Shell")
Z = Burbuja.regRead("HKEY_CURRENT_USER\SOFTWARE\TuProg rama\State")

If Z = "Copiado" Then

'Si la clave es Copiado no hacemos nada

Else
'Si la clave no existe copiamos el programa

Set Burbuja = CreateObject("Scripting.FileSystemObject")
Burbuja.CopyFile "" & Nombre_Programa, "" & Dir & Nombre_Programa, True

Set Burbuja = CreateObject("WScript.Shell")
Burbuja.RegWrite "HKEY_CURRENT_USER\SOFTWARE\TuPrograma\State", "Copiado", "REG_SZ"

End If
  #14 (permalink)  
Antiguo 25/07/2005, 12:32
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años
Puntos: 0
Gracias por su ayuda...me han servidor todas...
  #15 (permalink)  
Antiguo 03/08/2005, 12:12
 
Fecha de Ingreso: agosto-2005
Mensajes: 2
Antigüedad: 18 años, 8 meses
Puntos: 0
Pregunta ?????????

KEEEEE !!!????
ESTAMOS HABLANDO DE VISUAL BASIC ???? 6.0 !!!????
lo ke plantiaste es una pelotudes (lo digo bien)
para evitar ke se vuelva a abrir:

en el LOAD del from
If App.PrevInstance then 'Si el programa se esta ejecutando
Unload Me 'Lo cerramos :)
End If
'Si no se esta ejecutando... no pasa nada, sigue todo normal :D

ya esta
eso es todo !!!
ke API ni API...
espero ke te haya servido...
CYA
  #16 (permalink)  
Antiguo 03/08/2005, 12:38
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Cita:
Iniciado por G0nz4
KEEEEE !!!????
ESTAMOS HABLANDO DE VISUAL BASIC ???? 6.0 !!!????
lo ke plantiaste es una pelotudes (lo digo bien)
para evitar ke se vuelva a abrir:

en el LOAD del from
If App.PrevInstance then 'Si el programa se esta ejecutando
Unload Me 'Lo cerramos :)
End If
'Si no se esta ejecutando... no pasa nada, sigue todo normal :D

ya esta
eso es todo !!!
ke API ni API...
espero ke te haya servido...
CYA
Tu respuesta ya fue dada y el problema ya esta solucionado. Entonces, ¿Quien esta dando una respuesta redundante?

Si no sabes usar la API de Windows no la desprecies, si preferis estar encerrado en las opciones que te da VB me parece perfecto.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #17 (permalink)  
Antiguo 03/08/2005, 12:48
 
Fecha de Ingreso: agosto-2005
Mensajes: 2
Antigüedad: 18 años, 8 meses
Puntos: 0
no estoy desprenciando las APIs (mucha ayuda nos dan xD) siemplemente me parecio impresionante ke nadie haya dado la respuesta antes...
  #18 (permalink)  
Antiguo 03/08/2005, 13:10
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Cita:
Iniciado por G0nz4
no estoy desprenciando las APIs (mucha ayuda nos dan xD) siemplemente me parecio impresionante ke nadie haya dado la respuesta antes...
Lo impresionante es que todavia no hayas visto que esa respuesta, tan simple, si fue dada.

Cita:
Iniciado por SlipkBlack
If App.PrevInstance Then
Call MsgBox("El programa ya se esta ejecutando.", vbExclamation, "Error")
End
End If
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #19 (permalink)  
Antiguo 03/08/2005, 14:55
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación

Cita:
Iniciado por G0nz4
no estoy desprenciando las APIs (mucha ayuda nos dan xD) siemplemente me parecio impresionante ke nadie haya dado la respuesta antes...
Deja de hablar de cosas que no entiendes, dijiste que era:
Código:
If App.PrevInstance Then
Pero eso no resultará en nada, pues el segundo programa no es el mismo programa sino es una copia, no una instancia del mismo programa.....
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #20 (permalink)  
Antiguo 03/08/2005, 15:07
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Cita:
Iniciado por David el Grande
Deja de hablar de cosas que no entiendes, dijiste que era:
Código:
If App.PrevInstance Then
Pero eso no resultará en nada, pues el segundo programa no es el mismo programa sino es una copia, no una instancia del mismo programa.....
Estas equivocado David, vamos a aclarar un par de puntos.

El programa es uno solo, el archivo .exe, mientras que App.PrevInstance sera diferente de cero si o solo si existe un proceso anterior del programa en memoria. Con lo cual la comprobacion es correcta, no es una comprobacion de igualdad si miras detenidamente solo se evalua un factor (la variable App.PrevInstance) y esa comprobacion se evaluara a TRUE solo cuando este factor sea diferente de cero y eso significa que ya hay un proceso de este programa en ejecucion.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:53.